ฉันสังเกตว่าเมื่อฉันใช้ Logcat กับ Eclipse กับ ADT สำหรับ Android ฉันได้รับข้อความจากแอปพลิเคชันอื่น ๆ เช่นกัน มีวิธีกรองหรือไม่และแสดงเฉพาะข้อความจากแอปพลิเคชันของฉันเท่านั้น
ฉันสังเกตว่าเมื่อฉันใช้ Logcat กับ Eclipse กับ ADT สำหรับ Android ฉันได้รับข้อความจากแอปพลิเคชันอื่น ๆ เช่นกัน มีวิธีกรองหรือไม่และแสดงเฉพาะข้อความจากแอปพลิเคชันของฉันเท่านั้น
คำตอบ:
ชื่อแพคเกจรับประกันว่าจะไม่ซ้ำกันเพื่อให้คุณสามารถใช้Logฟังก์ชั่นที่มีแท็กเป็นชื่อแพคเกจของคุณแล้วกรองตามชื่อแพคเกจ :
หมายเหตุ: ในฐานะที่เป็นเครื่องมือสร้าง 21.0.3 สิ่งนี้จะไม่ทำงานเนื่องจากแท็กถูก จำกัด ไว้ที่ 23 ตัวอักษรหรือน้อยกว่า
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-dหมายถึงอุปกรณ์จริงและ-eหมายถึงโปรแกรมจำลอง หากมีโปรแกรมจำลองการทำงานมากกว่า 1 ตัวคุณสามารถใช้-s emulator-<emulator number>(เช่น-s emulator-5558)
ตัวอย่าง: adb -d logcat com.example.example:I *:S
หรือถ้าคุณใช้System.out.printเพื่อส่งข้อความไปยังบันทึกคุณสามารถใช้adb -d logcat System.out:I *:Sเพื่อแสดงเฉพาะการโทรไปที่ System.out
คุณสามารถค้นหาระดับการบันทึกและข้อมูลเพิ่มเติมได้ที่นี่: https://developer.android.com/studio/command-line/logcat.html
http://developer.android.com/reference/android/util/Log.html
แก้ไข: ดูเหมือนว่าฉันกระโดดปืนเล็กน้อยและเพิ่งรู้ว่าคุณกำลังถามเกี่ยวกับ logcat ใน Eclipse สิ่งที่ฉันโพสต์ข้างต้นสำหรับการใช้ logcat ผ่าน adb จากบรรทัดคำสั่ง ฉันไม่แน่ใจว่าตัวกรองเดียวกันนี้ถ่ายโอนไปยัง Eclipse หรือไม่
logcat <your package name>:<log level>คำตอบแนะนำว่าเป็นไปได้ที่จะใช้ชื่อแพคเกจเป็นตัวกรองที่ถูกต้อง ฉันจำเป็นต้องอ่านคำตอบสองครั้งเพื่อทำความเข้าใจกับสิ่งที่มันกำลังพูดดังนั้นฉันขอแนะนำให้เปลี่ยนบรรทัดแรกเป็นบางสิ่งเช่น " logcat <tag>:<log level>ซึ่ง<tag>อาจเป็นชื่อแพ็คเกจของคุณหากคุณใช้เป็นแท็กในandroid.util.Log"
ใช้ ps / grep / cut เพื่อจับ PID จากนั้น grep สำหรับรายการ logcat ด้วย PID นั้น นี่คือคำสั่งที่ฉันใช้:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(คุณสามารถปรับปรุง regex เพิ่มเติมเพื่อหลีกเลี่ยงปัญหาเชิงทฤษฎีของบันทึกการใช้งานที่ไม่เกี่ยวข้องซึ่งมีหมายเลขเดียวกัน แต่มันไม่เคยเป็นปัญหาสำหรับฉันเลย)
สิ่งนี้ยังใช้งานได้เมื่อจับคู่หลายกระบวนการ
บน Windows คุณสามารถทำได้:
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`
ตั้งแต่ Android 7.0, logcat มีตัวเลือก --pid filter และคำสั่ง pidof พร้อมใช้งานให้แทนที่ com.example.app เป็นชื่อแพ็คเกจของคุณ
(ubuntu terminal / ตั้งแต่ Android 7.0)
adb logcat --pid=`adb shell pidof -s com.example.app`
หรือ
adb logcat --pid=$(adb shell pidof -s com.example.app)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่ง pidof:
https://stackoverflow.com/a/15622698/7651532
grepและfindstrตัวเลือก แต่พวกเขาเป็นเพียงการกรองบันทึกที่มีค่าบางอย่างไม่รวมข้อความจำนวนมาก คำตอบของคุณคือของจริงแสดงบันทึกทั้งหมดเกี่ยวกับแอปโดยไม่รวมข้อความบันทึกจากไลบรารีอื่น มันเหมือนตัวกรอง 'แสดงเฉพาะที่เลือก' ปัจจุบันของ Android Studio ขอบคุณ!
เพิ่มตัวกรอง

ระบุชื่อ

เลือกตัวกรองของคุณ

สำหรับฉันมันใช้งานได้ใน mac Terminal
ไปที่โฟลเดอร์ที่คุณมีadbแล้วพิมพ์คำสั่งด้านล่างใน terminal
./adb logcat MyTAG:V AndroidRuntime:E *:S
ที่นี่มันจะกรองบันทึกทั้งหมดของMyTAGและAndroidRuntime
Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");2) ไปที่ DEBUG เข้าสู่ระบบ Android $ adb -s RKSCWSOV5SAIEUSC shell;3) $ logcat MyTAG:V AndroidRuntime:E *:S 4) ตอนนี้มันจะแสดง verbose ของ MyTAG และข้อผิดพลาดของ AndroidRuntime
ไม่กี่ปีที่ผ่านมาและสิ่งต่าง ๆ ก็เปลี่ยนไป และ Eclipse ไม่ได้รับการสนับสนุนอย่างเป็นทางการอีกต่อไป ดังนั้นนี่เป็นอีกสองวิธีที่เป็นปัจจุบันมากขึ้น:
ในAndroid monitorกล่องเครื่องมือคุณสามารถกรอง logcat debuggable processต่อ โดยปกติเมื่อคุณพัฒนาแอปพลิเคชันมันเป็นกระบวนการที่สามารถดีบักได้ ทุกครั้งที่ฉันมีปัญหากับสิ่งนี้และทำสิ่งต่อไปนี้:
Tools-> ->Android
หากเปิดใช้งานอยู่แล้วให้ปิดและเปิดใหม่Enable ADB Integration
ถอดและเสียบอุปกรณ์มือถือของคุณ
นอกจากนี้ยังมีตัวเลือกในการกรองผ่าน regex และระดับการดีบัก
นี่คือเสื้อคลุมงูหลามที่ดีadb logcatถ้าคุณต้องการใช้เทอร์มินัลโซลูชั่น สิ่งที่ดีเกี่ยวกับมันคือคุณสามารถบันทึกการกำหนดค่าหลาย ๆ และเพียงแค่นำมาใช้ใหม่ การกรองด้วยtagsความน่าเชื่อถือ คุณสามารถกรองตามpackageเพื่อดูบันทึกของแอปหนึ่งแอปขึ้นไปเท่านั้น แต่คุณจะเริ่มต้นlogcat-colorทันทีก่อนที่จะเปิดแอพของคุณ
ดูเหมือนว่าฉันไม่สามารถแสดงความคิดเห็นกับคำตอบก่อนหน้าดังนั้นฉันจะโพสต์ใหม่ นี่เป็นข้อคิดเห็นของคำตอบของTom Mulcahyซึ่งแสดงให้เห็นว่าคำสั่งควรเปลี่ยนแปลงอย่างไรเพื่อให้ทำงานบนอุปกรณ์ส่วนใหญ่เนื่องจากadb shell psคอลัมน์ PID เป็นตัวแปร
หมายเหตุ:คำสั่งด้านล่างใช้สำหรับกรณีที่คุณเชื่อมต่อกับอุปกรณ์จำนวนมาก ดังนั้นdevice idเป็นสิ่งจำเป็น มิฉะนั้นคุณสามารถละเว้นเครื่องหมาย '[', ']'
1. หากต้องการค้นหาคอลัมน์ของ pid ให้พิมพ์:
adb [-s DEVICE_ID] shell ps | head -n 1
ตอนนี้จำหมายเลขคอลัมน์สำหรับ PID 1นับเริ่มต้นจาก
2. จากนั้นพิมพ์ดังต่อไปนี้:
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
เพียงใส่คอลัมน์ที่คุณจดจำPUT_COLUMN_HEREเช่น$5
ทุกครั้งที่คุณเรียกใช้แอปพลิเคชันของคุณใหม่คุณจะต้องเรียกใช้คำสั่งที่ 2 อีกครั้งเนื่องจากแอปพลิเคชันได้รับ PID ใหม่จากระบบปฏิบัติการ
สิ่งนี้ได้ผลสำหรับฉันในการทุบตี git:
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
นำไปใช้กับ 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}:"
แล้ว:
applog.sh com.example.my.package
log.d("TAG", "multine\nlog")ตัวอย่าง): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'- ฉันซ้ายออกtrผมสมมติว่ามันจำเป็นบนระบบ Windows และฉันห่อAPPIDในวงเล็บที่จะอนุญาตให้ PIDs mulitple (คั่นด้วย|) .
สิ่งนี้ใช้ได้กับฉันด้วยการแก้ไขข้อบกพร่อง USB:
เชื่อมต่ออุปกรณ์และใช้:
adb shell
ใช้ logcat เมื่อเชื่อมต่อ:
logcat | grep com.yourapp.packagename
หากคุณใช้Android Studioคุณสามารถเลือกกระบวนการที่คุณต้องการรับ logcats นี่คือภาพหน้าจอ

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
ฉันเขียนเชลล์สคริปต์สำหรับการกรอง logcat โดยชื่อแพ็คเกจซึ่งฉันคิดว่าน่าเชื่อถือกว่าการใช้
ps | grep com.example.package | cut -c10-15
มันใช้ / proc / $ pid / cmdline เพื่อหา pid จริงจากนั้นทำการ grep บน logcat
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename`ด้วยสีและบันทึกของแอปอย่างต่อเนื่อง
adb shell pidof ...บิตไม่ทำงานสำหรับฉันดังนั้นฉันadb shelled ลงในอุปกรณ์และวิ่งtopคัดลอก PID สำหรับ app ของฉันมีแล้วแทนที่มันในคำสั่งของคุณ
pgrepแทน pidof
ADT v15 สำหรับ Eclipse ให้คุณระบุชื่อแอปพลิเคชัน (ซึ่งจริงๆแล้วเป็นค่าแพคเกจใน androidmanifest.xml ของคุณ)
ฉันชอบความสามารถในการกรองโดยแอป แต่ logcat ใหม่มีข้อผิดพลาดกับ autoscroll เมื่อคุณเลื่อนขึ้นเล็กน้อยเพื่อดูบันทึกก่อนหน้ามันจะเลื่อนกลับไปที่ด้านล่างโดยอัตโนมัติในไม่กี่วินาที ดูเหมือนว่าการเลื่อนไปทาง 1/2 บันทึกจะทำให้ไม่สามารถกระโดดกลับไปที่ด้านล่าง แต่มักจะไร้ประโยชน์
แก้ไข: ฉันพยายามระบุตัวกรองแอปจากบรรทัดคำสั่ง - แต่ไม่มีโชค หากมีคนคิดวิธีนี้หรือวิธีหยุดการเลื่อนอัตโนมัติโปรดแจ้งให้เราทราบ
การใช้คำสั่งของ Windows adb logcat -d | findstr <package>พรอมต์:
* นี่เป็นครั้งแรกที่jj_พูดถึงแต่ฉันใช้เวลานานกว่าจะหามันเจอในความคิดเห็น ...
เป็นตัวแปรคุณสามารถใช้PID Catของบุคคลที่สามโดย Jake Wharton สคริปต์นี้มีข้อดีสองประการที่สำคัญ:
จากเอกสาร:
ในระหว่างการพัฒนาแอปพลิเคชันคุณมักต้องการแสดงเฉพาะข้อความบันทึกที่มาจากแอปของคุณ น่าเสียดายเนื่องจาก ID กระบวนการเปลี่ยนแปลงทุกครั้งที่คุณปรับใช้กับโทรศัพท์มันกลายเป็นความท้าทายในการ grep สำหรับสิ่งที่ถูกต้อง
สคริปต์นี้แก้ปัญหานั้นได้ด้วยการกรองตามแพ็คเกจแอปพลิเคชัน
ฉันไม่แน่ใจว่าจะมีวิธีดูเฉพาะข้อความระบบที่เกี่ยวกับแอปของคุณ แต่คุณสามารถกรองตามสตริงได้ หากคุณทำบันทึกในโปรแกรมคุณสามารถรวมคำหลักที่ไม่ซ้ำกันและกรองตามคำนั้น
ลอง: หน้าต่าง -> การตั้งค่า -> Android -> LogCat เปลี่ยนฟิลด์ "แสดงมุมมอง logcat หาก ... " ค่า "VERBOSE" มันช่วยฉัน
หากคุณกำลังใช้Eclipseกดเครื่องหมาย + สีเขียวในlogcatหน้าต่างด้านล่างและใส่ชื่อแพคเกจของคุณ (com.example.yourappname) ในโดยการประยุกต์ใช้ชื่อกล่อง นอกจากนี้เลือกชื่อที่สะดวกสบายสำหรับคุณในกล่องชื่อตัวกรองแล้วคลิกตกลง คุณจะเห็นเฉพาะข้อความที่เกี่ยวข้องกับแอปพลิเคชันของคุณเมื่อเลือกตัวกรองที่คุณเพิ่งเพิ่มจากบานหน้าต่างด้านซ้ายใน logCat
ตั้งชื่อบันทึกของคุณ ฉันเรียกฉันว่า "wawa"

ใน Android Studio ให้ไปที่ Android-> แก้ไขการกำหนดค่าตัวกรอง

จากนั้นพิมพ์ชื่อที่คุณให้บันทึก ในกรณีของฉันมันเรียกว่า "wawa" นี่คือตัวอย่างของประเภทตัวกรองที่คุณสามารถทำได้ คุณสามารถกรองตามชื่อ System.out, System.err, Logs หรือ Package:

นี่อาจเป็นทางออกที่ง่ายที่สุด
ด้านบนของโซลูชันจาก Tom Mulcahy คุณสามารถทำให้มันง่ายขึ้นเช่นด้านล่าง:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
การใช้งานเป็นเรื่องง่ายเหมือนนามแฝงปกติ เพียงพิมพ์คำสั่งในเชลล์ของคุณ:
logcat
การตั้งค่านามแฝงทำให้มีประโยชน์ และ regex ทำให้มันแข็งแกร่งสำหรับแอพแบบหลายกระบวนการโดยสมมติว่าคุณสนใจกระบวนการหลักเท่านั้น
เพราะคุณสามารถตั้งชื่อแทนเพิ่มเติมสำหรับแต่ละกระบวนการตามที่คุณต้องการ หรือใช้วิธีแก้ปัญหาของ hegazy :)
นอกจากนี้หากคุณต้องการตั้งค่าระดับการบันทึกข้อมูลก็คือ
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
ใน Windows 10 การใช้ Ionic สิ่งที่ได้ผลดีกับฉันคือการรวม 'findstr' เข้ากับ "INFO: CONSOLE" ที่สร้างโดยข้อความของแอพทั้งหมด ดังนั้นคำสั่งของฉันในบรรทัดคำสั่งคือ:
adb logcat | findstr INFO:CONSOLE
ฉันพยายามใช้คำตอบของ Tom Mulcahy แต่น่าเสียดายที่มันไม่ทำงานกับแอพพลิเคชั่นที่มีหลายโพรเซสดังนั้นฉันจึงแก้ไขให้เหมาะกับความต้องการของฉัน
#!/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"
ใช้-s!
คุณควรใช้แท็กของคุณเองดูที่: http://developer.android.com/reference/android/util/Log.html
ชอบ.
Log.d("AlexeysActivity","what you want to log");และเมื่อคุณต้องการอ่านบันทึกการใช้>
adb logcat -s AlexeysActivityที่กรองทุกอย่างที่ไม่ได้ใช้แท็กเดียวกัน
นอกจากคำตอบของTom Mulcahyหากคุณต้องการกรองโดย PID บนคอนโซลของ Windows คุณสามารถสร้างไฟล์แบตช์ขนาดเล็กเช่นนั้น:
@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%
นี่เป็นคำถามที่เห็นได้ชัดว่ามีจุดประสงค์ที่จะใช้ Logcat จากด้านนอกของอุปกรณ์นักพัฒนาอย่างไรก็ตามถ้าคุณต้องการแสดงผลลัพธ์ Logcat บนอุปกรณ์ (โดยทางโปรแกรม) คุณเพียงแค่ต้องการสิ่งนี้:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
*:Dที่สิ้นสุดกรองข้อความด้านล่างระดับการบันทึกทุก Debug แต่คุณสามารถปล่อยให้เห็นว่า
ตอนนี้สามารถพิมพ์แท็ก: nameofthetag หรือ app: nameoftheapp เพื่อกรองโดยไม่ต้องเพิ่มตัวกรองใหม่ในแถบตัวกรองที่บันทึกไว้
ใน intelliJ (และอาจอยู่ใน eclipse ด้วย) คุณสามารถกรองผลลัพธ์ logcat ด้วยwebviewแบบข้อความดังนั้นมันจึงพิมพ์โดยทั่วไปทุกอย่างที่ phonegap กำลังผลิต
เป็นอีกหนึ่งตัวแปรของ Gavriel ที่applog.shรองรับอุปกรณ์และแอพพลิเคชั่นหลายตัวที่มีกระบวนการหลายขั้นตอน:
#!/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}"
การใช้งาน: applog.sh com.example.my.package [-s <specific device>]
ใน linux สิ่งนี้ใช้ได้กับฉัน:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`