Jak wykluczyć niektóre wiadomości według nazwy TAG za pomocą logcat adb Androida?

123

Logcat umożliwia filtrowanie dzienników, ale działa to w ten sposób: definiujesz filtry i logcat wyświetla tylko wiadomości pasujące do filtrów. Ale czy istnieje sposób na wyświetlenie wszystkich dzienników Z WYJĄTKIEM niektórych tagów zdefiniowanych przez filtry?

Kostas
źródło

Odpowiedzi:

52

Jeśli używasz, adb logcatmożesz potokować go przez grep i użyć jego odwróconego dopasowania: Ze strony podręcznika grep :

v, --invert-match Odwraca sens dopasowania, aby wybrać niepasujące wiersze.

Na przykład:

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

Możesz to rozszerzyć, używając wyrażeń regularnych .

Oto przykład takiego wyrażenia:

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

Ten sprawdzałby, czy wystąpiło którekolwiek z podanych, a grep nie wyświetlałby ich wtedy.

chris polzer
źródło
1
@zest grepto standardowe polecenie unixowe. W przypadku okien możesz spróbować find /V "notshownmatchpattern". PS Wygląda na to, że powłoka adb ma również rozszerzenie grep. Ale to nie to samo, co standardowy unix grep!
PCoder,
Tak, już to znalazłem, findstr - suck, można zainstalować powershell lub grep (dla Windowsa :), tak samo jak Linux jak napisano w readme, ale nie tak bardzo w praktyce)
Gennadiy Ryabkin
Nie ma sprawy, chciałbym po prostu zainstalować gita w systemie Windows za pomocą narzędzi wiersza poleceń git. To zainstalowałoby wszystkie podstawowe narzędzia wiersza poleceń unixa dla windowze.
chris polzer
lub zainstaluj clink dla popularnych narzędzi wiersza poleceń unixa w windowze
chris polzer
@PCoder Czy możesz napisać całą komendę, aby zrobić to samo z Windows CMD?
Raghav Satyadev
217

Możesz to zrobić z poziomu DDMS Monitor (a także Eclipse lub Android Studio) za pomocą pola wprowadzania wyrażeń regularnych i negatywnych asercji wyprzedzających , na przykład wykluczam wiele szumów z mojego dziennika, wykonując następujące czynności:

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

(„Tag:” nie jest częścią wyrażenia regularnego, ale informuje LogCat, aby zastosować wyrażenie regularne tylko do pola Tag. Jeśli użyjesz tej sztuczki w zapisanym filtrze, umieść tylko wyrażenie regularne w polu wprowadzania „Tag” i pomiń prefiks „tag:”)

W panelu monitorowania logcat w Android Studio można ustawić zapisany filtr, otwierając menu rozwijane w prawym górnym rogu (może mieć zaznaczoną opcję „Pokaż tylko wybraną aplikację”) i wybierając opcję Edytuj konfigurację filtru. Utwórz nowy filtr logcat i umieść ^(?!(WifiMulticast... itd. ))w polu Log Tag, z Regexzaznaczonym polem wyboru.

ZoFreX
źródło
Dobre rozwiązanie dla Eclipse LogCat
Seraphim's
6
Moja wizja jest od razu mniej rozmyta! : D
suomi35
Tego właśnie szukam od dłuższego czasu
ar-g
Działało jak urok! Wielkie dzięki. Dodaj również słowo „dalvikvm”. Najbardziej irytujące jest w logcat.
Atul
1
Odpowiedź z filtrowaniem logcat jest właściwa - stackoverflow.com/a/17468665/828237
kwesolowski
74

Jeśli chcesz wykluczyć lub przefiltrować określone wiadomości według nazwy tagu w Android Studio, przejdź do okna LogCat => Edytuj konfigurację filtru i wprowadź następujące informacje w polu „by Log Tag (regex)”:

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

Zauważ, że nie ma spacji, to ważne

Phileo99
źródło
ta odpowiedź działa w logcat> Edytuj konfigurację filtru intellij 15, który wywołuje modal zatytułowany „Utwórz nowy filtr Logcat”.
petey
1
Dziękuję Ci. Przy okazji telefony Lenovo mają wiele wiadomości w dzienniku spamu
Seagull
Zapobiega to jednak tylko renderowaniu do dziennika dzienników z tym tagiem. Monitor wciąż jest zasypywany tymi wywołaniami w tle i wypycha wywołania inne niż "tag1 | tag2 | etc" z bufora. Czy jest na to sposób?
TheBestBigAl
Odpowiedź z filtrowaniem logcat jest właściwa - stackoverflow.com/a/17468665/828237
kwesolowski
Lub jeśli jeden tag^(?!tag1)
Vlad
34

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

Spowoduje to wykluczenie tekstów posiadających zawartość WindowManager, dalvik, ...

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

Spowoduje to wykluczenie tagów WindowManager, dalvik, ... z logcat

Rino
źródło
^(?!(WifiMulticast|WifiHW|MtpService|PushClient|EGL_emulation|OpenGl*|InputReader|art|dalvik|Environment|DataRouter|AlarmManager|WindowManager|PhoneStatusBar|ActivityManager|ResourceType|PackageManager|gralloc*))
Jeszcze trochę
I więcej: (Gnss | NetRec | ResolverController | GAv4 | AsyncOperation | AppOps | WificondControl | aofp | wifi | netmgr | ctxmgr | BestClock | FirebaseInstanceId | android.os.Debug | memtrack | netd | system_server | StrictonMode | bluetooth | FASTMONMOD | BroadcastQueue | ConnextivityService | WakeLock | HttpClientWrapper | RAWR | Tenor | BgTask | WifiService | BluetoothAdapter | UpdateStatsService | AppIdleHistory | Connectivity | VelvetNetworkClient | WorkerManager | EGL_emulation | chatStty | gralloc | PContextMetricsRunner))
Graeme
32

Z poziomu powłoki możesz użyć polecenia takiego jak:

adb logcat AlarmManagerService:S PowerManagerService:S *:V

który będzie zawierał wszystkie dzienniki oprócz tych z AlarmManagerServiceiPowerManagerService tagami .

( :SSkrót oznacza „cichy”, co oznacza, że ​​nic nie zostanie wydrukowane dla tych tagów; :Voznacza „gadatliwy”, co oznacza, że ​​wszystkie inne tagi zostaną wydrukowane. Dokumentacja systemu Android dla logcat zawiera więcej szczegółów na temat innych opcji, których możesz użyć w filtry.)

Możesz także użyć ANDROID_LOG_TAGSzmiennej środowiskowej, aby ustawić domyślne filtry, np. (W bash):

export ANDROID_LOG_TAGS="AlarmManagerService:S PowerManagerService:S *:V"
Bogaty
źródło
To dobra sugestia i działa z wiersza poleceń bez potoków. Powinieneś zaktualizować swoją odpowiedź imho, aby wyjaśnić, że część „: S” będzie emitować komunikaty o poważnym znaczeniu tylko dla wymienionych komponentów (co rzadko się zdarza). Znowu dobra odpowiedź. Ludzie powinni głosować na to ...
Chris Markle,
1
@ChrisMarkle Zgodnie z dokumentacją oznacza Sto „cichy”. Zaktualizowałem odpowiedź, aby to wyjaśnić, tak jak sugerujesz.
Rich
2
Możesz filtrować dane wyjściowe programu logcat w ten sam sposób, używając zmiennej środowiskowej ANDROID_LOG_TAGS. Uważam, że warto mieć zawsze ustawioną opcję wykluczania niektórych bardziej spamerskich procesów.
emidander
16

Połącz zarówno dodatnie, jak i ujemne wyprzedzanie, aby uzyskać skuteczniejsze filtrowanie.

Przykład:

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

Dołączone są etykiety w pierwszych zagnieżdżonych nawiasach.

Tagi na drugim miejscu są wykluczone.

Piekarz
źródło
IMHO, to jest bardziej wszechstronny sposób filtrowania logów.
Ritesh Gune
4

Oto lista filtrów, których używałem do ignorowania dzienników systemowych Samsung . działałby również z innymi urządzeniami.

Logcat -> Edytuj konfigurację filtru -> 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))
Ramesh Jaya
źródło
1

Prostym sposobem jest filtrowanie tylko tych tagów, które chcesz zobaczyć.

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

Wyświetli tylko te tagi.

Wintermute
źródło
0

W widoku Eclipse Logcat nie ma takiej opcji. Możesz jednak skorzystać z poziomu dziennika, aby wykluczyć każdą wiadomość, której poziom dziennika jest zbyt niski. Np. ustawienie go na I (nfo) nie wyświetla komunikatów D (ebug) i (V) erbose.

Lars Blumberg
źródło
Cóż, zapomniałem wspomnieć, że używam tego w wierszu poleceń / w telefonie do czytania dzienników. I za każdym razem, gdy dotykam ekranu, pokazuje on komunikaty InputReader / InputDispatcher, które właśnie zalewają ekran. Teraz widzę też ustawienie filtrów na „InputReader: S InputDispatcher: S” :) Dzięki za odpowiedź!
Kostas