ฉันสังเกตว่าเมื่อฉันใช้ 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 shell
ed ลงในอุปกรณ์และวิ่ง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}'`