Ich habe festgestellt, dass ich bei Verwendung von Logcat mit Eclipse mit ADT für Android auch Nachrichten von vielen anderen Anwendungen erhalte. Gibt es eine Möglichkeit, dies zu filtern und nur Nachrichten aus meiner eigenen Anwendung anzuzeigen?
Ich habe festgestellt, dass ich bei Verwendung von Logcat mit Eclipse mit ADT für Android auch Nachrichten von vielen anderen Anwendungen erhalte. Gibt es eine Möglichkeit, dies zu filtern und nur Nachrichten aus meiner eigenen Anwendung anzuzeigen?
Antworten:
Paketnamen sind garantiert eindeutig, sodass Sie die Log
Funktion mit dem Tag als Paketnamen verwenden und dann nach Paketnamen filtern können :
HINWEIS: Ab Build Tools 21.0.3 funktioniert dies nicht mehr, da TAGS auf maximal 23 Zeichen beschränkt sind.
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d
bezeichnet ein tatsächliches Gerät und -e
bezeichnet einen Emulator. Wenn es mehr als 1 Emulator Sie verwenden können -s emulator-<emulator number>
(zB -s emulator-5558
)
Beispiel: adb -d logcat com.example.example:I *:S
Wenn Sie System.out.print
Nachrichten an das Protokoll senden, können Sie adb -d logcat System.out:I *:S
nur Anrufe an System.out anzeigen.
Alle Protokollebenen und weitere Informationen finden Sie hier: https://developer.android.com/studio/command-line/logcat.html
http://developer.android.com/reference/android/util/Log.html
EDIT: Sieht so aus, als hätte ich ein wenig mit der Waffe gesprungen und nur gemerkt, dass Sie in Eclipse nach Logcat gefragt haben. Was ich oben gepostet habe, ist für die Verwendung von logcat über adb über die Befehlszeile. Ich bin nicht sicher, ob dieselben Filter in Eclipse übertragen werden.
logcat <your package name>:<log level>
die Antwort verwenden, können Sie den Paketnamen als gültigen Filter verwenden. Ich musste die Antwort zweimal lesen, um zu verstehen, was sie tatsächlich sagt. Daher empfehle ich, die erste Zeile einfach in " logcat <tag>:<log level>
Wo <tag>
kann Ihr Paketname sein, wenn Sie sie auch als Tag in verwenden android.util.Log
" zu ändern
Verwenden Sie ps / grep / cut, um die PID zu ermitteln, und suchen Sie dann nach logcat-Einträgen mit dieser PID. Hier ist der Befehl, den ich benutze:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(Sie könnten den regulären Ausdruck weiter verbessern, um das theoretische Problem nicht verwandter Protokollzeilen mit derselben Nummer zu vermeiden, aber es war für mich nie ein Problem.)
Dies funktioniert auch, wenn mehrere Prozesse abgeglichen werden.
Unter Windows können Sie Folgendes tun:
adb logcat | findstr com.example.package
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
adb logcat | findstr com.example.package
adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
Seit Android 7.0 verfügt logcat über die Filteroption --pid, und der Befehl pidof ist verfügbar. Ersetzen Sie com.example.app durch Ihren Paketnamen.
(Ubuntu Terminal / Seit Android 7.0)
adb logcat --pid=`adb shell pidof -s com.example.app`
oder
adb logcat --pid=$(adb shell pidof -s com.example.app)
Weitere Informationen zum Befehl pidof:
https://stackoverflow.com/a/15622698/7651532
grep
und ausprobiert findstr
, aber sie filtern nur Protokolle mit einem bestimmten Wert, ausgenommen viele Nachrichten. Ihre Antwort ist die echte. Zeigen Sie alle Protokolle über die App an, ohne die Protokollnachricht aus anderen Bibliotheken auszuschließen. Es ist wie in Android Studio der aktuelle Filter "Nur ausgewählt anzeigen". Vielen Dank!
Filter hinzufügen
Geben Sie Namen an
Wählen Sie Ihren Filter.
Für mich funktioniert dies in Mac. Terminal
Gehen Sie zu dem Ordner, in dem Sie den folgenden adb
Befehl im Terminal eingegeben haben
./adb logcat MyTAG:V AndroidRuntime:E *:S
Hier werden alle Protokolle von MyTAG
und gefiltertAndroidRuntime
Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");
2) zum DEBUG-Login bei Android $ adb -s RKSCWSOV5SAIEUSC shell;
3) $ logcat MyTAG:V AndroidRuntime:E *:S
4) Jetzt wird ausführlich MyTAG und Fehler von AndroidRuntime angezeigt
Es ist ein paar Jahre her und die Dinge haben sich geändert. Und Eclipse wird nicht mehr offiziell unterstützt. Hier sind zwei weitere aktuelle Ansätze:
In der Android monitor
Toolbox können Sie logcat pro filtern debuggable process
. Wenn Sie eine Anwendung entwickeln, handelt es sich normalerweise um einen debuggbaren Prozess. Hin und wieder habe ich Probleme damit und mache Folgendes:
Tools
-> Android
-> Enable ADB Integration
.
Wenn es bereits aktiviert war, schalten Sie es aus und wieder ein
Trennen Sie Ihr Mobilgerät vom Computer und schließen Sie es erneut an.
Es gibt auch Optionen zum Filtern über Regex und die Debug-Ebene
Dies ist ein netter Python-Wrapper, adb logcat
wenn Sie eine terminalbasierte Lösung verwenden möchten. Das Gute daran ist, dass Sie mehrere Konfigurationen speichern und einfach wiederverwenden können. Das Filtern nach tags
ist sehr zuverlässig. Sie können auch filtern package
, um nur Protokolle einer oder mehrerer Apps logcat-color
anzuzeigen. Sie beginnen jedoch direkt vor dem Start Ihrer App.
Es scheint, dass ich frühere Antworten nicht kommentieren kann, daher werde ich eine neue veröffentlichen. Dies ist ein Kommentar zu Tom Mulcahys Antwort, der zeigt, wie sich der Befehl ändern sollte, um auf den meisten Geräten zu funktionieren, da die adb shell ps
PID-Spalte variabel ist.
HINWEIS: Der folgende Befehl funktioniert in den Fällen, in denen Sie viele Geräte angeschlossen haben. Also device id
wird gebraucht. Andernfalls können Sie einfach die Klammern '[', ']' weglassen.
1. Um die Spalte von pid herauszufinden, geben Sie Folgendes ein:
adb [-s DEVICE_ID] shell ps | head -n 1
Speichern Sie nun die Spaltennummer für die PID. Die Nummerierung beginnt ab 1
.
2. Geben Sie dann Folgendes ein:
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
Fügen Sie einfach die Spalte ein, in der Sie sich gespeichert haben PUT_COLUMN_HERE
, z$5
Jedes Mal, wenn Sie Ihre Anwendung erneut ausführen, müssen Sie den zweiten Befehl erneut ausführen, da die Anwendung vom Betriebssystem eine neue PID erhält.
Setzen Sie dies auf applog.sh
#!/bin/sh
PACKAGE=$1
APPPID=`adb -d shell ps | grep "${PACKAGE}" | cut -c10-15 | sed -e 's/ //g'`
adb -d logcat -v long \
| tr -d '\r' | sed -e '/^\[.*\]/ {N; s/\n/ /}' | grep -v '^$' \
| grep " ${APPPID}:"
dann:
applog.sh com.example.my.package
log.d("TAG", "multine\nlog")
zum Beispiel getan haben ): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'
- Ich habe das weggelassen tr
, ich gehe davon aus , dass es auf Windows-Systemen benötigt wird, und ich habe das APPID
in Klammern gesetzt, um mehrere Pids zuzulassen (getrennt durch |
) .
Dies funktioniert bei mir mit USB-Debugging:
Schließen Sie das Gerät an und verwenden Sie:
adb shell
Verwenden Sie den Logcat, wenn eine Verbindung besteht:
logcat | grep com.yourapp.packagename
Wenn Sie Android Studio verwenden , können Sie den Prozess auswählen, von dem Sie Logcats erhalten möchten. Hier ist der Screenshot.
Log cat has a new option (on by default) which creates an application filter automatically such that only the launched application's output is shown
Ich habe ein Shell-Skript zum Filtern von logcat nach Paketnamen geschrieben, das meiner Meinung nach zuverlässiger ist als die Verwendung
ps | grep com.example.package | cut -c10-15
Es verwendet / proc / $ pid / cmdline, um die tatsächliche PID herauszufinden, und führt dann ein Grep für logcat durch
Mit ADT v15 für Eclipse können Sie einen Anwendungsnamen angeben (der tatsächlich der Paketwert in Ihrer androidmanifest.xml ist).
Ich liebe es, nach App filtern zu können, aber der neue Logcat hat einen Fehler mit dem Autoscroll. Wenn Sie ein wenig nach oben scrollen, um frühere Protokolle anzuzeigen, wird in wenigen Sekunden automatisch ein Bildlauf nach unten durchgeführt. Es scheint, als würde ein halber Weg nach oben im Protokoll verhindern, dass es nach unten zurückspringt, aber das ist oft nutzlos.
BEARBEITEN: Ich habe versucht, einen App-Filter über die Befehlszeile anzugeben - aber kein Glück. Wenn jemand dies herausfindet ODER wie man den Autoscroll stoppt, lass es mich wissen.
Verwenden der Windows-Eingabeaufforderung : adb logcat -d | findstr <package>
.
* Dies wurde zuerst von jj_ erwähnt , aber es hat ewig gedauert , bis ich es in den Kommentaren gefunden habe ...
Ubuntu: adb logcat -b alle -v Farbe --pid = `adb shell pidof -s com.packagename` Mit Farbe und fortlaufendem Protokoll der App
adb shell pidof ...
Bit hat bei mir nicht funktioniert, also habe ich mich adb shell
in das Gerät top
pgrep
statt pidof
Als Variante können Sie das Drittanbieter-Skript PID Cat von Jake Wharton verwenden. Dieses Skript hat zwei Hauptvorteile:
Aus der Dokumentation:
Während der Anwendungsentwicklung möchten Sie häufig nur Protokollnachrichten anzeigen, die von Ihrer App stammen. Da sich die Prozess-ID bei jeder Bereitstellung auf dem Telefon ändert, wird es leider zu einer Herausforderung, nach dem Richtigen zu suchen.
Dieses Skript löst dieses Problem durch Filtern nach Anwendungspaket.
Ich bin nicht sicher, ob es eine Möglichkeit gibt, nur Systemmeldungen zu Ihrer App anzuzeigen, aber Sie können anhand einer Zeichenfolge filtern. Wenn Sie ein Protokoll innerhalb des Programms erstellen, können Sie einfach ein bestimmtes eindeutiges Schlüsselwort einfügen und basierend auf diesem Wort filtern.
Versuchen Sie: Fenster -> Einstellungen -> Android -> LogCat. Ändern Sie im Feld "Logcat-Ansicht anzeigen, wenn ..." den Wert "VERBOSE". Es hat mir geholfen.
Wenn Sie Eclipse verwenden , drücken Sie das grüne + Zeichen im logCat- Fenster unten und geben Sie Ihren Paketnamen (com.example.yourappname) in das Feld nach Anwendungsname ein . Zudem wählen Sie einen beliebigen Namen für Sie angenehm in Filter Name Feld und klicken Sie auf OK. Sie sehen nur Nachrichten zu Ihrer Anwendung, wenn der gerade hinzugefügte Filter im linken Bereich der logCat ausgewählt wird.
Geben Sie Ihrem Protokoll einen Namen. Ich nannte meine "Wawa".
Gehen Sie in Android Studio zu Android-> Filterkonfigurationen bearbeiten
Geben Sie dann den Namen ein, den Sie den Protokollen gegeben haben. In meinem Fall heißt es "wawa". Hier sind einige Beispiele für die Filtertypen, die Sie ausführen können. Sie können nach System.out, System.err, Protokollen oder Paketnamen filtern:
Dies ist wahrscheinlich die einfachste Lösung.
Zusätzlich zu einer Lösung von Tom Mulcahy können Sie sie wie folgt weiter vereinfachen:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Die Verwendung ist als normaler Alias einfach. Geben Sie einfach den Befehl in Ihre Shell ein:
logcat
Das Alias-Setup macht es praktisch. Und der reguläre Ausdruck macht ihn robust für Apps mit mehreren Prozessen, vorausgesetzt, Sie kümmern sich nur um den Hauptprozess.
Natürlich können Sie für jeden Prozess weitere Aliase festlegen, wie Sie möchten. Oder verwenden Sie die Lösung von Hegazy. :) :)
Wenn Sie außerdem Protokollierungsstufen festlegen möchten, ist dies der Fall
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Ich habe versucht, die Antwort von Tom Mulcahy zu verwenden, aber leider funktionierte sie nicht für Anwendungen mit mehreren Prozessen, sodass ich sie an meine Bedürfnisse anpasse.
#!/bin/bash
if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi
echo "Lof for package name: $1"
PROCESSES=`adb shell ps | grep "$1" | cut -c10-15`
NUM_OF_PROCESSES=`echo "$PROCESSES" | wc -l`
if [ $NUM_OF_PROCESSES -eq 0 ]; then echo "The application is not running!"; exit 1; fi
COUNTER=1
for process in $PROCESSES; do
if [ $COUNTER -eq 1 ]; then GREP_TEXT="("; fi
GREP_TEXT+=$process
if [ $COUNTER -eq $NUM_OF_PROCESSES ]; then GREP_TEXT+=")"; else GREP_TEXT+="|"; fi
let COUNTER=COUNTER+1
if [ $COUNTER -gt $NUM_OF_PROCESSES ]; then break; fi
done
adb logcat | grep -E "$GREP_TEXT"
Verwenden Sie -s
!
Sie sollten Ihr eigenes Tag verwenden, siehe: http://developer.android.com/reference/android/util/Log.html
Mögen.
Log.d("AlexeysActivity","what you want to log");
Und wenn Sie dann das Protokoll lesen möchten, verwenden Sie>
adb logcat -s AlexeysActivity
Das filtert alles heraus, was nicht dasselbe Tag verwendet.
Zusätzlich zur Antwort von Tom Mulcahy können Sie, wenn Sie auf der Windows-Konsole nach PID filtern möchten, eine kleine Batchdatei wie folgt erstellen:
@ECHO OFF
:: find the process id of our app (2nd token)
FOR /F "tokens=1-2" %%A IN ('adb shell ps ^| findstr com.example.my.package') DO SET PID=%%B
:: run logcat and filter the output by PID
adb logcat | findstr %PID%
Dies ist offensichtlich eine Frage, die auf die Verwendung von Logcat von außerhalb des Entwicklergeräts abzielt. Wenn Sie jedoch die Logcat-Ausgabe (programmgesteuert) auf dem Gerät anzeigen möchten , benötigen Sie nur Folgendes :
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
Das *:D
am Ende filtert jede Nachricht unterhalb der Debug-Protokollstufe heraus, aber Sie können das weglassen.
Informationen zum Leiten der Ausgabe beispielsweise in eine Textansicht finden Sie hier .
Jetzt können Sie tag: nameofthetag oder app: nameoftheapp eingeben, um zu filtern, ohne der gespeicherten Filterleiste neue Filter hinzuzufügen
In IntelliJ (und wahrscheinlich auch in Eclipse) können Sie die Logcat-Ausgabe nach Text- Webview filtern , sodass im Grunde alles gedruckt wird, was Phonegap produziert
Eine weitere Variante von Gavriel applog.sh
mit Unterstützung mehrerer Geräte und Anwendungen mit mehreren Prozessen:
#!/bin/sh
PKG=$1
shift
APPIDS=`adb $@ shell ps | awk -v PKG="$PKG" '
(NR == 1){appcolumn=2; for (i=1; i<=NF; i++) if ($i=="PID") {appcolumn=i}}
index($0,PKG){print $(appcolumn)}' | paste -d \| -s`
echo "PID's: $APPIDS"
adb $@ logcat -v color | awk "(\$3 ~ /$APPIDS/){print \$0}"
Verwendungszweck: applog.sh com.example.my.package [-s <specific device>]
Unter Linux hat das bei mir funktioniert:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`