จะแยกข้อความบางข้อความตามชื่อ TAG โดยใช้ Android adb logcat ได้อย่างไร?


123

Logcat อนุญาตให้กรองบันทึก แต่ทำงานเช่นนั้น: คุณกำหนดตัวกรองและ logcat จะแสดงเฉพาะข้อความที่ตรงกับตัวกรอง แต่มีวิธีแสดงบันทึกทั้งหมดยกเว้นบางแท็กที่กำหนดโดยตัวกรองหรือไม่


คำตอบ:


52

หากคุณใช้adb logcatคุณสามารถไปป์ผ่าน grep และใช้การจับคู่แบบกลับด้าน: จากgrep manpage :

v, - กลับการจับคู่สลับความรู้สึกของการจับคู่เพื่อเลือกเส้นที่ไม่ตรงกัน

ตัวอย่างเช่น:

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

คุณสามารถขยายนี้โดยใช้การแสดงผลปกติ

นี่คือตัวอย่างของนิพจน์ดังกล่าว:

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

อันนี้จะตรวจสอบว่าเกิดอะไรขึ้นหรือไม่ grep จะไม่แสดงรายการเหล่านั้น


1
@zest grepเป็นคำสั่ง unix มาตรฐาน สำหรับ Windows find /V "notshownmatchpattern"คุณอาจลอง ปล. เห็นได้ชัดว่า adb shell ยังมีไฟล์grep. แต่มันไม่เหมือนกับยูนิกซ์มาตรฐานgrep!
PCoder

ใช่ฉันพบแล้ว findstr - ดูดเป็นไปได้ที่จะติดตั้ง powershell หรือ grep (สำหรับ windows :) เช่นเดียวกับ Linux ตามที่เขียนใน readme แต่ไม่มากในทางปฏิบัติ)
Gennadiy Ryabkin

ไม่มี adays ฉันแค่อยากให้ windows ติดตั้ง git ด้วยเครื่องมือคอมมานด์ไลน์ สิ่งนี้จะติดตั้งเครื่องมือบรรทัดคำสั่ง unix พื้นฐานทั้งหมดสำหรับ windowze
chris polzer

หรือติดตั้ง clink สำหรับเครื่องมือ unix commandline ทั่วไปบน windowze
chris polzer

@ PCoder คุณช่วยเขียนคำสั่งทั้งหมดเพื่อทำเช่นเดียวกันกับ windows CMD ได้ไหม
Raghav Satyadev

217

คุณสามารถทำได้จากภายใน DDMS Monitor (และ Eclipse หรือ Android Studio) ด้วยช่องป้อนนิพจน์ทั่วไปและการยืนยันการมองไปข้างหน้าเชิงลบตัวอย่างเช่นฉันไม่รวมเสียงรบกวนจำนวนมากจากบันทึกของฉันด้วยสิ่งต่อไปนี้:

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

("tag:" ไม่ได้เป็นส่วนหนึ่งของนิพจน์ทั่วไป แต่บอกให้ LogCat ใช้นิพจน์ทั่วไปกับฟิลด์แท็กเท่านั้นหากคุณใช้เคล็ดลับนี้ในตัวกรองที่บันทึกไว้ให้ใส่เฉพาะนิพจน์ทั่วไปในช่องป้อน "แท็ก" และละเว้น "tag:" นำหน้า)

ในบานหน้าต่างมอนิเตอร์ logcat ของ Android Studio คุณสามารถตั้งค่าตัวกรองที่บันทึกไว้สำหรับสิ่งนี้ได้โดยเปิดเมนูแบบเลื่อนลงที่มุมขวาบน (อาจมีการเลือก "แสดงเฉพาะแอปพลิเคชันที่เลือก") และเลือกแก้ไขการกำหนดค่าตัวกรอง สร้างตัวกรอง logcat ใหม่และใส่^(?!(WifiMulticast... ฯลฯ ))ในกล่องแท็กบันทึกโดยRegexเลือกช่องทำเครื่องหมาย


ทางออกที่ดีสำหรับ Eclipse LogCat
ของ Seraphim

6
การมองเห็นของฉันพร่ามัวน้อยลงทันที! : D
suomi35

นี่คือสิ่งที่ฉันมองหามานานแล้ว
ar-g

ทำงานอย่างมีเสน่ห์! ขอบคุณมาก. เพิ่มคำว่า "dalvikvm" ลงไปด้วย มันน่ารำคาญที่สุดใน logcat
Atul

1
คำตอบด้วยการกรอง logcat เป็นวิธีที่เหมาะสม - stackoverflow.com/a/17468665/828237
kwesolowski

74

หากคุณต้องการยกเว้นหรือกรองข้อความบางข้อความตามชื่อแท็กใน Android studio ให้ไปที่หน้าต่าง LogCat => แก้ไขการกำหนดค่าตัวกรองและป้อนข้อมูลต่อไปนี้ภายใต้ "by Log Tag (regex):"

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

โปรดทราบว่าไม่มีช่องว่างสิ่งนี้สำคัญ


คำตอบนี้ใช้ได้ใน logcat ของ intellij 15> Edit Filter Configuration ซึ่งจะแสดงโมดอลที่ชื่อว่า "Create New Logcat Filter"
petey

1
ขอบคุณ. โทรศัพท์ Lenovo Btw มีข้อความบันทึกสแปมจำนวนมาก
Seagull

สิ่งนี้จะป้องกันไม่ให้บันทึกที่มีแท็กนั้นแสดงผลไปยังบันทึกเท่านั้น จอภาพยังคงล้นมือด้วยการโทรเหล่านั้นในพื้นหลังและมันดันการเรียกที่ไม่ใช่ "tag1 | tag2 | etc" ออกจากบัฟเฟอร์ มีวิธีการประมาณนั้นหรือไม่?
TheBestBigAl

คำตอบด้วยการกรอง logcat เป็นวิธีที่เหมาะสม - stackoverflow.com/a/17468665/828237
kwesolowski

หรือถ้าหนึ่งแท็ก^(?!tag1)
Vlad

34

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

สิ่งนี้จะไม่รวมข้อความที่มีเนื้อหา WindowManager, dalvik, ...

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

ซึ่งจะไม่รวมแท็ก WindowManager, dalvik, ... จาก logcat


เพิ่มเติมบางส่วน:^(?!(WifiMulticast|WifiHW|MtpService|PushClient|EGL_emulation|OpenGl*|InputReader|art|dalvik|Environment|DataRouter|AlarmManager|WindowManager|PhoneStatusBar|ActivityManager|ResourceType|PackageManager|gralloc*))
Gurupad Mamadapur

และอื่น ๆ : (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 | อายุ | BgTask | WifiService | BluetoothAdapter | UpdateStatsService | AppIdleHistory | เชื่อมต่อ | VelvetNetworkClient | WorkerManager | EGL_emulation | ช่างพูด | gralloc | InputReader | ActivityThread | ActivityTaskManager | UsageStatsService | ocess.gservice | DropBoxManagerService | EventLogChimeraService | PContextMetricsRunner))
Graeme

32

จากเชลล์คุณสามารถใช้คำสั่งเช่น:

adb logcat AlarmManagerService:S PowerManagerService:S *:V

ซึ่งจะรวมบันทึกทั้งหมดนอกเหนือจากบันทึกที่มีแท็กAlarmManagerServiceและPowerManagerService

( :Sย่อมาจาก "silent" ซึ่งหมายความว่าจะไม่มีการพิมพ์สำหรับแท็กเหล่านั้น:Vย่อมาจาก "verbose" ซึ่งหมายถึงทุกอย่างจะถูกพิมพ์สำหรับแท็กอื่น ๆ ทั้งหมดเอกสาร Android สำหรับ logcatมีรายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกอื่น ๆ ที่คุณสามารถใช้ได้ใน ตัวกรอง)

คุณยังสามารถใช้ANDROID_LOG_TAGSตัวแปรสภาพแวดล้อมเพื่อตั้งค่าตัวกรองเริ่มต้นเช่น (ใน bash):

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

นี่เป็นคำแนะนำที่ดีและใช้งานได้จากบรรทัดคำสั่งโดยไม่มีท่อ คุณควรอัปเดตคำตอบของคุณ imho เพื่ออธิบายว่าส่วน ": S" จะส่งเฉพาะข้อความที่รุนแรงสำหรับส่วนประกอบที่มีชื่อเท่านั้น (ซึ่งแทบจะไม่เคยเกิดขึ้นเลย) อีกครั้งคำตอบที่ดี คนควรโหวตคนนี้ ...
Chris Markle

1
@ChrisMarkle ตามเอกสารSคือ 'เงียบ' ฉันได้อัปเดตคำตอบเพื่ออธิบายสิ่งนี้แล้วตามที่คุณแนะนำ
รวย

2
คุณสามารถกรองเอาต์พุต logcat ด้วยวิธีเดียวกันโดยใช้ตัวแปรสภาพแวดล้อม ANDROID_LOG_TAGS ฉันคิดว่ามีประโยชน์ที่จะตั้งค่าให้ยกเว้นกระบวนการที่เป็นสแปมเพิ่มเติมอยู่เสมอ
emidander

16

รวมทั้งการมองเชิงบวกและเชิงลบเพื่อการกรองที่มีประสิทธิภาพยิ่งขึ้น

ตัวอย่าง:

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

รวมแท็กในวงเล็บแรกที่ซ้อนกัน

ไม่รวมแท็กในวินาที


IMHO นี่เป็นวิธีการกรองบันทึกที่ครอบคลุมมากขึ้น
Ritesh Gune

4

นี่คือรายการตัวกรองที่ฉันใช้เพื่อละเว้นบันทึกระบบของSamsung จะทำงานร่วมกับอุปกรณ์อื่น ๆ ด้วย

Logcat -> แก้ไขการกำหนดค่าตัวกรอง -> แท็กบันทึก

^(?!(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

วิธีง่ายๆในการทำเช่นนี้คือการกรองเฉพาะแท็กที่คุณต้องการดู

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

จะแสดงเฉพาะแท็กเหล่านั้น


0

ภายในมุมมอง Eclipse Logcat ไม่มีตัวเลือกดังกล่าว อย่างไรก็ตามคุณสามารถใช้ระดับการบันทึกเพื่อยกเว้นข้อความใด ๆ ที่มีระดับการบันทึกต่ำเกินไป เช่น. การตั้งค่าเป็น I (nfo) จะไม่แสดงข้อความ D (ebug) และ (V) erbose


ฉันลืมที่จะพูดถึงว่าฉันใช้สิ่งนั้นบนพรอมต์คำสั่ง / ในโทรศัพท์เพื่ออ่านบันทึก และทุกครั้งที่ฉันแตะหน้าจอจะแสดงข้อความ InputReader / InputDispatcher ซึ่งกำลังท่วมหน้าจอ ตอนนี้ฉันเห็นว่าการตั้งค่าตัวกรองเป็น "InputReader: S InputDispatcher: S" ใช้งานได้ :) ขอบคุณสำหรับคำตอบ!
Kostas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.