LogCat filtern, um nur die Nachrichten von Meine Anwendung in Android zu erhalten?

340

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?

Vinod
quelle
1
In allen Antworten wird vorgeschlagen, nach Nachrichten aus der zu debuggenden App zu filtern. Selbst wenn diese Filter aktiviert sind, füllt der Logcat-Spam von anderen Apps bald den Protokollpuffer, egal wie groß er ist. Gibt es eine Möglichkeit, Eclipse anzuweisen, diese Nachrichten überhaupt nicht zu sammeln oder sie regelmäßig zu löschen?
Preis

Antworten:

267

Paketnamen sind garantiert eindeutig, sodass Sie die LogFunktion 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

-dbezeichnet ein tatsächliches Gerät und -ebezeichnet 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.printNachrichten an das Protokoll senden, können Sie adb -d logcat System.out:I *:Snur 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.

shanet
quelle
10
Ich weiß, dass es sich bei der Frage um Eclipse handelt, aber ich bin in die Befehlszeile verliebt und verwende sie immer auch für Logcat. Verwenden Sie auch einige Werkzeuge zum Färben der Ausgabe wie jsharkey.org/blog/2009/04/22/… macht es sogar nützlich
Francisco Jordano
1
Testen auf Emulator: Es blieb für mich hängen, wenn ich adb -e logcat com.example.example ausführe: I *: S, adb -d logcat System.out: I *: S funktioniert.
CoDe
1
@ Shubh Was meinst du, es steckte fest? Ich habe dies vor fast einem Jahr gepostet, sodass sich seitdem möglicherweise etwas in Logcat geändert hat.
shanet
58
Diese Methode filtert nach Tag, nicht nach App. Toms Methode filtert nach App
Jonas Alves
17
Wenn Sie 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
Flow
367

Linux und OS X.

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.

Windows

Unter Windows können Sie Folgendes tun:

adb logcat | findstr com.example.package
Tom Mulcahy
quelle
2
@ BRTNaidu: Sie können Cygwin installieren oder Git-Bash (Bash für Windows) verwenden
Phillip
1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale
1
Manchmal druckt gc die gleiche Nummer mit der PID-Nummer eines Prozesses, wenn Speicher frei ist. Hier ist eine andere Versionadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
Alijandro
14
Unter Windows können Sie adb logcat | findstr com.example.package
Folgendes
8
Nur eine kleine Änderung Ihrer Antwort. Ich würde vorschlagen:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd
59

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

Du Kim
quelle
2
Ich habe alle Optionen grepund 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!
Equiman
Diese beiden Befehle funktionieren so lange, wie der Prozess "com.example.app" ausgeführt wird. Es werden jedoch Fehlermeldungen angezeigt, wenn der Prozess nicht ausgeführt wird. Nur eine Randnotiz, um Überraschungen zu vermeiden.
Jonathanzh
53

Filter hinzufügen

Filter hinzufügen

Geben Sie Namen an

Geben Sie hier die Bildbeschreibung ein

Wählen Sie Ihren Filter.

Geben Sie hier die Bildbeschreibung ein

Beryllium
quelle
3
Es ist sehr wichtig, beim Entwerfen von Entwicklungstools präzise zu sein, da vom Benutzer erwartet wird, dass er präzise ist. Das ist der Paketname, nicht der Anwendungsname. > :(
Henrik Erlandsson
19

Für mich funktioniert dies in Mac. Terminal
Gehen Sie zu dem Ordner, in dem Sie den folgenden adbBefehl im Terminal eingegeben haben

./adb logcat MyTAG:V AndroidRuntime:E *:S

Hier werden alle Protokolle von MyTAGund gefiltertAndroidRuntime

Inder Kumar Rathore
quelle
2
1) Java-Code: 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
1
Dies ist die einzige Antwort, die unter MacOS für mich funktioniert hat. Gut gemacht.
om-ha
1
@ om-ha danke, ich habe Studio vor langer Zeit benutzt und wusste nicht, dass es immer noch das Problem gibt
Inder Kumar Rathore
1
Tatsächlich verwende ich Android Studio nicht. Ich verwende Flutter, Android SDK und Gradle. Als Editor VS Code. Dies ist also eine hervorragende Möglichkeit, um zu erfahren, was in meinem Android-Handy vor sich geht
om-ha
13

Update 17. Mai

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:

1. Android Studio

Geben Sie hier die Bildbeschreibung ein In der Android monitorToolbox 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:

  1. Tools-> Android-> Enable ADB Integration.
    Wenn es bereits aktiviert war, schalten Sie es aus und wieder ein

  2. 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

2. Logcat-Farbe

Dies ist ein netter Python-Wrapper, adb logcatwenn 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 tagsist sehr zuverlässig. Sie können auch filtern package, um nur Protokolle einer oder mehrerer Apps logcat-coloranzuzeigen. Sie beginnen jedoch direkt vor dem Start Ihrer App.

Alte Antwort:

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 psPID-Spalte variabel ist.

HINWEIS: Der folgende Befehl funktioniert in den Fällen, in denen Sie viele Geräte angeschlossen haben. Also device idwird 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

Vorbehalt

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.

Paschalis
quelle
Schauen Sie sich all diese Dinge an, die Sie tun müssen, um Protokolle für Ihre App zu erhalten, nicht für andere Apps. Außerdem finde ich es wirklich lächerlich, dass andere Leute die Protokolle anderer Leute sehen können. Wollen Sie mir sagen, dass Google nichts dagegen tun kann? Stellen Sie einfach sicher, dass meine Protokolle nicht von anderen Personen gesehen werden, und halten Sie meinen Logcat sauber?
TatiOverflow
10

Das hat bei mir in git bash funktioniert:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
wubwubb
quelle
ist es möglich, es in Android-Code zu verwenden?
niko1312
9

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

Gavriel
quelle
Hier ist eine Variation des Filters zum Erfassen mehrzeiliger Protokolle (wenn Sie dies 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 APPIDin Klammern gesetzt, um mehrere Pids zuzulassen (getrennt durch |) .
Logan Pickup
9

Dies funktioniert bei mir mit USB-Debugging:

  1. Schließen Sie das Gerät an und verwenden Sie:

    adb shell

  2. Verwenden Sie den Logcat, wenn eine Verbindung besteht:

    logcat | grep com.yourapp.packagename

Lennoard Silva
quelle
7

Wenn Sie Android Studio verwenden , können Sie den Prozess auswählen, von dem Sie Logcats erhalten möchten. Hier ist der Screenshot.

Geben Sie hier die Bildbeschreibung ein

dmSherazi
quelle
1
Ab Android Studio Version 0.4.5 erhalten Sie Nachrichten von der App, die nur ausgeführt wird. 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
dmSherazi
7

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

https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a

Kevin
quelle
6

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.

Aaron T. Harris
quelle
6

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 ...

seltene Klasse
quelle
6

Ubuntu: adb logcat -b alle -v Farbe --pid = `adb shell pidof -s com.packagename` Mit Farbe und fortlaufendem Protokoll der App

Sandeep PC
quelle
Das adb shell pidof ...Bit hat bei mir nicht funktioniert, also habe ich mich adb shellin das Gerät top
eingearbeitet
versuchen pgrepstatt pidof
Lennoard Silva
4

Als Variante können Sie das Drittanbieter-Skript PID Cat von Jake Wharton verwenden. Dieses Skript hat zwei Hauptvorteile:

  • Zeigt Protokolleinträge für Prozesse aus einem bestimmten Anwendungspaket an
  • Farblogcat

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.

Eine Ausgabe sieht aus wie Geben Sie hier die Bildbeschreibung ein

yoAlex5
quelle
2

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.

bjpcomet
quelle
2

Versuchen Sie: Fenster -> Einstellungen -> Android -> LogCat. Ändern Sie im Feld "Logcat-Ansicht anzeigen, wenn ..." den Wert "VERBOSE". Es hat mir geholfen.

Siruk Viktor
quelle
2

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.

Khaled Alanezi
quelle
2

Geben Sie Ihrem Protokoll einen Namen. Ich nannte meine "Wawa".

Geben Sie hier die Bildbeschreibung ein

Gehen Sie in Android Studio zu Android-> Filterkonfigurationen bearbeiten

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Gen
quelle
2

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`"
Frank Du
quelle
2

Unter Windows 10 mit Ionic funktionierte es für mich hervorragend, 'findstr' mit dem von allen App-Nachrichten generierten "INFO: CONSOLE" zu kombinieren. Mein Befehl in der Kommandozeile lautet also:

adb logcat | findstr INFO:CONSOLE
Lud Akell
quelle
1

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"
Ahmed Hegazy
quelle
1

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.

Quelle

KrisWebDev
quelle
1
Gehen Sie nicht davon aus, dass Sie den Code schreiben. Möglicherweise interessieren Sie sich für Nachrichten aus Bibliotheken, und Sie können die Protokollzeichenfolgen nicht ändern.
James Moore
1

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%
Lawyno
quelle
1

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 *:Dam 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 .

Tom Ladek
quelle
0

Jetzt können Sie tag: nameofthetag oder app: nameoftheapp eingeben, um zu filtern, ohne der gespeicherten Filterleiste neue Filter hinzuzufügen

Fernando Gallego
quelle
0

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

Marcin Mikołajczyk
quelle
0

Eine weitere Variante von Gavriel applog.shmit 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>]

ls.illarionov
quelle
-1

Unter Linux hat das bei mir funktioniert:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
Spectralsun
quelle