Wie kann ich bestimmte Nachrichten nach TAG-Namen mit Android adb logcat ausschließen?


122

Logcat ermöglicht das Filtern von Protokollen, funktioniert jedoch folgendermaßen: Sie definieren Filter und logcat zeigt nur Nachrichten an, die mit Filtern übereinstimmen. Aber gibt es eine Möglichkeit, alle Protokolle mit Ausnahme einiger durch Filter definierter TAGs anzuzeigen?


Antworten:


51

Wenn Sie verwenden, können adb logcatSie es durch grep leiten und es invertiert verwenden: Von der grep-Manpage :

v, --invert-match Invertiert den Übereinstimmungssinn, um nicht übereinstimmende Linien auszuwählen.

Beispielsweise:

$adb logcat | grep --invert-match 'notshownmatchpattern' 

Sie können dies erweitern, indem Sie reguläre Ausdrücke verwenden .

Hier ist ein Beispiel für einen solchen Ausdruck:

"/^(?:emails|tags|addresses)"

Dieser würde prüfen, ob eines der angegebenen Ereignisse eintritt, grep würde sie dann nicht auflisten.


1
@zest grepist ein Standard-Unix-Befehl. Für Windows können Sie versuchen find /V "notshownmatchpattern". PS Anscheinend hat die ADB-Shell auch eine grep. Aber es ist nicht dasselbe wie das Standard-Unix grep!
— PCoder

Ja, ich habe es bereits gefunden, findstr - saugen, möglich, Powershell oder Grep zu installieren (für Windows :), genau wie Linux, wie in Readme geschrieben, aber nicht so sehr in der Praxis)
— Gennadiy Ryabkin

Keine Adays, ich würde nur empfehlen, dass Windows Git mit Git-Befehlszeilentools installiert. Dies würde alle grundlegenden Unix-Befehlszeilentools für windowze installieren.
— Chris Polzer

oder installiere clink für gängige Unix-Kommandozeilen-Tools auf windowze
— chris polzer

@PCoder können Sie bitte den gesamten Befehl schreiben, um dasselbe mit Windows CMD zu tun?
— Raghav Satyadev

217

Sie können dies in DDMS Monitor (und auch in Eclipse oder Android Studio) mit dem Eingabefeld für reguläre Ausdrücke und negativen Vorausschau-Aussagen tun. Beispielsweise schließe ich viel Rauschen aus meinem Protokoll aus, und zwar mit den folgenden Angaben :

tag:^(?!(WifiMulticast|WifiHW|MtpService|PushClient))

(Das "Tag:" ist nicht Teil des regulären Ausdrucks, weist LogCat jedoch an, nur den regulären Ausdruck auf das Tag-Feld anzuwenden. Wenn Sie diesen Trick in einem gespeicherten Filter verwenden, geben Sie nur den regulären Ausdruck in das Eingabefeld "Tag" ein und lassen Sie das Präfix "tag:" weg)

Im Logcat-Monitorbereich von Android Studio können Sie einen gespeicherten Filter dafür einrichten, indem Sie das Dropdown-Menü oben rechts öffnen (möglicherweise ist "Nur ausgewählte Anwendung anzeigen" ausgewählt) und Filterkonfiguration bearbeiten auswählen. Erstellen Sie einen neuen Logcat-Filter und setzen Sie ^(?!(WifiMulticast... etc. ))im Feld Log Tag mit Regexaktiviertem Kontrollkästchen.


Gute Lösung für Eclipse LogCat
— Seraphim

6
Meine Sicht ist sofort weniger verschwommen! : D
— suomi35

Dies ist, was ich für eine ganze Weile suche
— ar-g

Arbeitete wie Charme! Danke vielmals. Fügen Sie auch das Wort "dalvikvm" hinzu. Es ist am ärgerlichsten in Logcat.
— Atul

1
Die Antwort mit Logcat-Filterung ist die richtige - stackoverflow.com/a/17468665/828237
— kwesolowski

74

Wenn Sie bestimmte Nachrichten in Android Studio nach Tag-Namen ausschließen oder filtern möchten, rufen Sie das LogCat-Fenster => Filterkonfiguration bearbeiten auf und geben Sie unter "Nach Log-Tag (regulärer Ausdruck)" Folgendes ein: "

^(?!(tag1|tag2|tag3|tag4))

Beachten Sie, dass keine Leerzeichen vorhanden sind. Dies ist wichtig


Diese Antwort funktioniert in Intellij 15s Logcat> Filterkonfiguration bearbeiten, wodurch ein Modal mit dem Titel "Neuen Logcat-Filter erstellen" angezeigt wird.
— Petey

1
Danke dir. Übrigens haben Lenovo Telefone viele Spam-Protokollnachrichten
— Seagull

Dies verhindert jedoch nur, dass Protokolle mit diesem Tag in das Protokoll gerendert werden. Der Monitor wird immer noch mit diesen Aufrufen im Hintergrund überfüllt und schiebt die Nicht-Aufrufe "tag1 | tag2 | etc" aus dem Puffer. Gibt es einen Weg, das zu umgehen?
— TheBestBigAl

Die Antwort mit Logcat-Filterung ist die richtige - stackoverflow.com/a/17468665/828237
— kwesolowski

Oder wenn ein Tag^(?!tag1)
— Vlad

34

^(?!.*(WindowManager|dalvik|Environment|DataRouter|AlarmManager)).*$

Dies schließt Texte mit Inhalten aus WindowManager, dalvik, ...

tag:^(?!.*(WindowManager|dalvik|Environment|DataRouter|AlarmManager)).*$

Dadurch werden die Tags WindowManager, dalvik, ... von logcat ausgeschlossen


Noch mehr:^(?!(WifiMulticast|WifiHW|MtpService|PushClient|EGL_emulation|OpenGl*|InputReader|art|dalvik|Environment|DataRouter|AlarmManager|WindowManager|PhoneStatusBar|ActivityManager|ResourceType|PackageManager|gralloc*))
— Gurupad Mamadapur

Und mehr: (Gnss | NetRec | ResolverController | GAv4 | AsyncOperation | AppOps | WificondControl | aofp | wifi | netmgr | ctxmgr | BestClock | FirebaseInstanceId | android.os.Debug | memtrack | netd | system_server | StrictMode | BroadcastQueue | ConnextivityService | WakeLock | HttpClientWrapper | RAWR | Tenor | BgTask | WifiService | BluetoothAdapter | UpdateStatsService | AppIdleHistory | Konnektivität | VelvetNetworkClient | WorkerManager | EGL_emulation | chatty | gralloc | PContextMetricsRunner))
— Graeme

32

In der Shell können Sie einen Befehl wie den folgenden verwenden:

adb logcat AlarmManagerService:S PowerManagerService:S *:V

Dies schließt alle Protokolle außer denen mit den Tags AlarmManagerServiceund ein PowerManagerService.

(Die :SStände stehen für "stumm", was bedeutet, dass für diese Tags nichts gedruckt wird. Die :VStände für "ausführlich" bedeuten, dass für alle anderen Tags alles gedruckt wird. In der Android-Dokumentation für logcat finden Sie weitere Details zu anderen Optionen, die Sie verwenden können die Filter.)

Sie können auch die ANDROID_LOG_TAGSUmgebungsvariable verwenden, um Standardfilter einzurichten, z. B. (in Bash):

export ANDROID_LOG_TAGS="AlarmManagerService:S PowerManagerService:S *:V"

Dies ist ein guter Vorschlag und funktioniert über die Befehlszeile ohne Pipelines. Sie sollten Ihre Antwort imho aktualisieren, um zu erklären, dass der Teil ": S" nur schwerwiegende Nachrichten für die genannten Komponenten ausgibt (was kaum jemals vorkommt). Wieder eine gute Antwort. Die Leute sollten diesen abstimmen ...
— Chris Markle

1
@ ChrisMarkle Laut den Dokumenten Sist das für "still". Ich habe die Antwort aktualisiert, um dies zu erklären, wie Sie vorschlagen.
— Rich

2
Sie können die Logcat-Ausgabe auf dieselbe Weise mit der Umgebungsvariablen ANDROID_LOG_TAGS filtern. Ich finde es nützlich, dass es immer so eingestellt ist, dass einige der spammigeren Prozesse ausgeschlossen werden.
— Emidander

16

Kombinieren Sie sowohl positiven als auch negativen Lookahead für eine leistungsstärkere Filterung.

Beispiel:

(?=(AndroidRuntime|Main|RandomTag))(?!(Audio))

Tags in den ersten verschachtelten Klammern sind enthalten.

Tags in der Sekunde sind ausgeschlossen.


IMHO, Dies ist eine umfassendere Methode zum Filtern von Protokollen.
— Ritesh Gune

4

Hier ist eine Liste von Filtern, mit denen ich Samsung- Systemprotokolle ignoriert habe . würde auch mit anderen Geräten funktionieren.

Logcat -> Filterkonfiguration bearbeiten -> Log-Tag

^(?!(PowerUI|PowerPlanningReceiver|BatteryService|SamsungPhoneWindowManager|MotionRecognitionService|AudioService|APM_AudioPolicyManager|SensorService|StorageManager|SignalClusterView|BatteryService|TelephonyManager|UsbDeviceManager|KeyguardUpdateMonitor|BatteryController|ActivityManager|LauncherAppsService|AppsModel|DataLoader|PackageManager|LauncherApps|ContactsImsCommon|ImsUtil|ImsSettingsProvider|DeviceConfigManager|WifiService|BackupManagerService|PersonaManagerService|DefaultDialerManager|ResourceType|NetworkUIGlobals|NetworkProxy|FileWriteThread|ReflectUtil|PhoneApp|SamsungAlarmManager|display|DeviceStorageMonitorService|wrapperGPS|io_stats|GnssLocationProvider|KeyguardServiceBoxContainer|ConnectivityService|SSRM|TLC_TIMA_PKM_initialize|mc_tlc_communication|TeeDriverClient|TLC_TIMA_PKM_measure_kernel|AutomaticBrightnessController|BatteryUtils|WifiConnectivityManager|Launcher|IconView|ApplicationPackageManager|LiveIconLoader|WifiScanningService|WifiHAL|WifiScanController|ApplicationPolicy|SELinux|TimaKeyStoreProvider|ActivityThread|zygote|GservicesProvider|GoogleHttpClient|cr_ChildProcessConnect|WificondControl|Netd|Tethering|ContactsImsCommon|ImsConstants|tnet-jni|BatteryStatsService|SignalClusterView|LiveIconManager|BitmapCacheContainer|com.samsung.android.app.powerplanning.utils.BatteryUtils|ReflectField|cr_ChildConnAllocator|TinLoadingFailTracker|WifiPermissionsUtil|EventHandler_FLP|android.hardware.wifi@1.0-service|BluetoothAdapter|bt_btm|WifiPermissionsUtil|GeofencerStateMachine|Places|GCoreUlr|BeaconBle|Sensors|SLocation|ContactsProvider_EventLog|WificondScannerImpl|AlarmManager|AlarmManagerEXT|MultiDex|NetworkSecurityConfig|DnsProxyListener|dalvik-internals|mobileconfig|SsacManager|ImsPhoneStateManager|VolteServiceModule|PdnController|PowerManagerService|GameManagerService|NoSync|SensorManager|DisplayPowerController|NetworkController|SamsungAnalytics111040|tlcFidoAuthnr|InputReader|FlashlightController|KeyguardWallpaperController|OpenGLRenderer|EasyMuteController|Vibrator|VibratorService|PowerManagerUtil|LightsService|WindowManager|InputDispatcher|InputReader|CustomFrequencyManagerService|SystemUIAnalytics|SamsungAnalytics|swipe|PanelView|BadgeCache|MARsPolicyManager|MARsDBManager|KeyguardClockPage|ScanManager|RegiMgrBase|secImsManager|GeolocationController|MultiSimUtils|CarrierText|Mms|NetworkNotificationUI2|CommandListener|ReschedulableTimer|RCS-ContactsImsCommon|Settings|DmConfigModule|NotificationMgr2|PhoneMultiSimUtils|PhoneProxy|VideoCapabilities|AudioCapabilities|SAIV_FACE|FaceController|FaceService|SamsungAnimationCreator|ImageWallpaper|Finsky|VirtualScreen|PagedView|DragLayer|HomeContainer|ImsServiceStub|DmConfigHelper|TZ))

1

Eine einfache Möglichkeit, dies zu tun, besteht darin, nur die Tags zu filtern, die Sie sehen möchten.

adb logcat -s "Tag1" -s "Tag2" -s "Tag3"

Ruft nur diese Tags auf.


0

In der Eclipse Logcat-Ansicht gibt es keine solche Option. Sie können jedoch die Protokollebene verwenden, um Nachrichten auszuschließen, deren Protokollebene zu niedrig ist. Z.B. Wenn Sie es auf I (nfo) setzen, werden keine D (ebug) - und (V) erbose-Nachrichten angezeigt.


Nun, ich habe vergessen zu erwähnen, dass ich das an der Eingabeaufforderung / in einem Telefon verwende, um Protokolle zu lesen. Und jedes Mal, wenn ich auf einen Bildschirm tippe, werden InputReader / InputDispatcher-Meldungen angezeigt, die gerade den Bildschirm überfluten. Jetzt sehe ich auch das Setzen von Filtern auf "InputReader: S InputDispatcher: S" funktioniert :) Danke für eine Antwort!
— Kostas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.