Logcat คือเครื่องมือบรรทัดคำสั่งที่ทำสำเนาบันทึกของข้อความระบบ รวมถึง
ข้อความที่คุณเขียนจากแอปด้วย
Log
ชั้นเรียน
หน้านี้เกี่ยวข้องกับเครื่องมือบรรทัดคำสั่ง logcat
แต่คุณยังดูบันทึกได้ด้วย
ข้อความจากหน้าต่าง Logcat ใน Android Studio สำหรับ
ข้อมูลเกี่ยวกับการดูและการกรองบันทึกจาก Android Studio
โปรดดูที่ดูและเขียนบันทึกด้วย
Logcat
ภาพรวมของระบบการบันทึก
ระบบการบันทึกของ Android คือชุดบัฟเฟอร์วงกลมที่มีโครงสร้างซึ่งระบบดูแลรักษา
กระบวนการ logd
ชุดบัฟเฟอร์ที่พร้อมใช้งานได้รับการแก้ไขและกำหนดโดยองค์ประกอบ
ระบบ บัฟเฟอร์ที่เกี่ยวข้องมากที่สุด ได้แก่
main
: เก็บบันทึกแอปพลิเคชันส่วนใหญ่system
: จัดเก็บข้อความที่มาจากระบบปฏิบัติการ Android-
crash
: จัดเก็บบันทึกข้อขัดข้อง แต่ละรายการในบันทึกจะมีลำดับความสำคัญ ซึ่งก็คือแท็กที่ระบุ ต้นทางของบันทึก และข้อความบันทึกจริง
อินเทอร์เฟซ C/C++ หลักของระบบการบันทึกคือไลบรารีที่ใช้ร่วมกัน liblog
และส่วนหัวคือ <android/log.h>
ศูนย์การบันทึกเฉพาะภาษาทั้งหมด
(รวม android.util.Log
)
เรียกใช้ฟังก์ชันนี้
__android_log_write
โดยค่าเริ่มต้น โมเดลจะเรียกใช้ฟังก์ชัน
__android_log_logd_logger
ซึ่งจะส่งรายการบันทึกไปยัง logd
โดยใช้ซ็อกเก็ต ตั้งแต่ API ระดับ 30 เป็นต้นไป ฟังก์ชันการบันทึกสามารถเปลี่ยนแปลงได้ด้วยการเรียก
__android_set_log_writer
ดูข้อมูลเพิ่มเติมได้ใน
เอกสาร NDK
บันทึกที่แสดงโดย adb logcat
จะผ่านการกรอง 4 ระดับดังนี้
- การกรองเวลาคอมไพล์
- บันทึกบางรายการอาจมีข้อมูลครบถ้วน ขึ้นอยู่กับการตั้งค่าการคอมไพล์
ออกจากไบนารีแล้ว ตัวอย่างเช่น สามารถกำหนดค่า ProGuard เพื่อนำการเรียกไปยัง
Log.d
จากโค้ด Java - การกรองพร็อพเพอร์ตี้ของระบบ
liblog
ค้นหาชุดพร็อพเพอร์ตี้ของระบบเพื่อ กำหนดระดับความรุนแรงขั้นต่ำที่จะส่งไปยังlogd
หากบันทึกของคุณมี แท็กMyApp
พร็อพเพอร์ตี้ต่อไปนี้ได้รับการตรวจสอบและควรมี อักษรตัวแรกของความรุนแรงขั้นต่ำ (V
,D
,I
,W
,E
หรือS
เพื่อปิดบันทึกทั้งหมด) ให้ทำดังนี้log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
- การกรองแอปพลิเคชัน
- หากไม่ได้ตั้งค่าพร็อพเพอร์ตี้ไว้
liblog
จะใช้ลำดับความสำคัญขั้นต่ำที่กำหนดโดย__android_log_set_minimum_priority
การตั้งค่าเริ่มต้นคือINFO
- การกรองการแสดงผล
adb logcat
รองรับตัวกรองเพิ่มเติมที่สามารถลด จำนวนบันทึกที่แสดงจากlogd
ดูหัวข้อเกี่ยวกับ การกรองเอาต์พุตของบันทึกเพื่อดูรายละเอียดเพิ่มเติม
ไวยากรณ์บรรทัดคำสั่ง
หากต้องการเรียกใช้ logcat
ผ่าน Shell adb
การใช้งานทั่วไปคือ
[adb] shell logcat [<option>] ... [<filter-spec>] ...
นอกจากนี้ยังมีชวเลข adb logcat
อีกด้วย แต่จะขยายเป็น
adb shell logcat
ตัวเลือก
logcat
มีตัวเลือกมากมาย ตัวเลือกที่มีจะขึ้นอยู่กับระบบปฏิบัติการ
เวอร์ชันของอุปกรณ์ที่คุณใช้งานอยู่ หากต้องการดูความช่วยเหลือเกี่ยวกับ logcat
สำหรับ
อุปกรณ์ที่คุณใช้งานอยู่ ให้สั่งการ:
adb logcat --help
โปรดทราบว่าเนื่องจาก logcat
เป็นเครื่องมือสำหรับนักพัฒนาแอประบบปฏิบัติการต่างๆ รวมถึงนักพัฒนาแอป
(ซึ่งนักพัฒนาแอปคาดว่าจะใช้ Android Studio แทน) ตัวเลือกส่วนใหญ่มีเพียง
ใช้เป็น root
ได้
กรองเอาต์พุตของบันทึก
แท็กของข้อความบันทึกคือสตริงสั้นๆ ที่ระบุคอมโพเนนต์ของระบบที่ ข้อความเริ่มทำงาน เช่น "View" สำหรับระบบมุมมอง
ลำดับความสำคัญคือค่าอักขระค่าใดค่าหนึ่งต่อไปนี้ โดยเรียงลำดับจากต่ำสุดไปสูงสุด ลำดับความสำคัญ:
V
: รายละเอียด (ลำดับความสำคัญต่ำสุด)D
: แก้ไขข้อบกพร่องI
: ข้อมูลW
: คำเตือนE
: ข้อผิดพลาดF
: ร้ายแรงS
: ปิดเสียง (มีลำดับความสำคัญสูงสุด โดยไม่พิมพ์รายการใด)
หากต้องการดูรายการแท็กที่ใช้ในระบบที่มีลำดับความสำคัญ ให้เรียกใช้
logcat
และสังเกต 2 คอลัมน์แรกของแต่ละข้อความ ตามที่ระบุเป็น
<priority>/<tag>
ต่อไปนี้เป็นตัวอย่างของเอาต์พุต logcat
สั้นๆ ที่ได้มาพร้อมกับ
คำสั่ง logcat -v brief output
ผลลัพธ์แสดงให้เห็นว่าข้อความเกี่ยวข้องกับ
ลำดับความสำคัญ "I" และแท็ก "ActivityManager" ดังนี้
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
หากต้องการลดเอาต์พุตของบันทึกในระดับที่จัดการได้ ให้จำกัดเอาต์พุตของบันทึกโดยใช้ ตัวกรอง นิพจน์ นิพจน์ตัวกรองให้คุณระบุลำดับความสำคัญของแท็กในระบบ ชุดค่าผสมที่คุณสนใจ ระบบจะระงับข้อความอื่นๆ สำหรับ แท็กที่ระบุ
นิพจน์ตัวกรองใช้รูปแบบ tag:priority ...
โดยที่ tag
ระบุแท็กที่สนใจและ priority
แสดงระดับต่ำสุดของ
ลำดับความสำคัญของรายงานสำหรับแท็กนั้น ข้อความสำหรับแท็กที่ลำดับความสำคัญที่ระบุไว้หรือสูงกว่า
เขียนลงในบันทึก ระบุข้อกำหนด tag:priority
จำนวนเท่าใดก็ได้ใน
เป็นนิพจน์ตัวกรองเพียงรายการเดียว ชุดข้อกำหนดจะคั่นด้วยช่องว่าง
ต่อไปนี้เป็นตัวอย่างนิพจน์ตัวกรองที่ระงับข้อความบันทึกทั้งหมด ยกเว้น รายการที่มีแท็ก "ActivityManager" ลำดับความสำคัญของ "ข้อมูล" หรือสูงกว่า และรายการที่มีแท็ก "แอปของฉัน" ที่มีลำดับความสำคัญ "แก้ไขข้อบกพร่อง" ขึ้นไป:
adb logcat ActivityManager:I MyApp:D *:S
องค์ประกอบสุดท้ายในนิพจน์ที่อยู่ก่อนหน้า *:S
ตั้งค่าระดับความสำคัญสำหรับ
แท็กทั้งหมดให้เป็น "ปิดเสียง" เพื่อให้บันทึกเฉพาะข้อความด้วย "ActivityManager" และ "แอปของฉัน" คือ
แสดงอยู่ การใช้ *:S
จะทำให้เอาต์พุตของบันทึกถูกจำกัดไว้เฉพาะ
ตัวกรองที่คุณระบุไว้อย่างชัดแจ้ง *:S
ให้ตัวกรองของคุณทำหน้าที่เป็น
เป็นรายการที่อนุญาตสำหรับเอาต์พุตบันทึก
หมายเหตุ: ในบางเชลล์ "*
" สงวนไว้โดย Shell หากคุณ
กำลังใช้เชลล์ดังกล่าว ให้รวมนิพจน์ตัวกรองในเครื่องหมายคำพูด: adb logcat
"ActivityManager:I MyApp:D *:S"
นิพจน์ตัวกรองต่อไปนี้จะแสดงข้อความบันทึกทั้งหมดที่มี "คำเตือน" ระดับความสำคัญ และ สูงกว่าในแท็กทั้งหมด
adb logcat *:W
หากคุณใช้ logcat
จากคอมพิวเตอร์การพัฒนาแทนที่จะเรียกใช้บน
Shell adb
ระยะไกล คุณยังสามารถตั้งค่านิพจน์ตัวกรองเริ่มต้นได้โดยการส่งออกค่าสำหรับ
ตัวแปรสภาพแวดล้อม ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
ระบบจะไม่ส่งออกตัวกรอง ANDROID_LOG_TAGS
ไปยังโปรแกรมจำลอง/อุปกรณ์
หากคุณกำลังเรียกใช้ logcat
จาก Shell ระยะไกลหรือใช้ adb shell
logcat
ควบคุมรูปแบบเอาต์พุตของบันทึก
ข้อความบันทึกมีช่องข้อมูลเมตามากมายนอกเหนือจากแท็กและลำดับความสำคัญ คุณสามารถ
แก้ไขรูปแบบเอาต์พุตสำหรับข้อความเพื่อให้แสดงฟิลด์ข้อมูลเมตาที่เฉพาะเจาะจง โดยดำเนินการดังนี้
ใช้ตัวเลือก -v
และระบุรูปแบบเอาต์พุตที่รองรับรูปแบบใดรูปแบบหนึ่งต่อไปนี้
brief
: แสดงลำดับความสำคัญ แท็ก และ PID ของกระบวนการออกแอตทริบิวต์long
: แสดงช่องข้อมูลเมตาทั้งหมดและแยกข้อความที่เว้นว่างไว้ เส้นprocess
: แสดงเฉพาะ PIDraw
: แสดงข้อความบันทึกดิบที่ไม่มีช่องข้อมูลเมตาอื่นๆtag
: แสดงลำดับความสำคัญและแท็กเท่านั้นthread:
รูปแบบเดิมที่แสดงลำดับความสำคัญ, PID และ TID ของ ชุดข้อความที่ออกข้อความthreadtime
(ค่าเริ่มต้น): แสดงวันที่ เวลาการเรียกใช้ ลำดับความสำคัญ แท็ก, PID และ TID ของเทรดที่ออกข้อความtime
: แสดงวันที่ เวลาเรียกใช้ ลำดับความสำคัญ แท็ก และ PID ของ กระบวนการออกข้อความ
เมื่อเริ่ม logcat
ให้ระบุรูปแบบเอาต์พุตที่ต้องการโดยใช้เมธอด
ตัวเลือก -v
:
[adb] logcat [-v <format>]
ตัวอย่างที่แสดงวิธีสร้างข้อความในเอาต์พุต thread
มีดังนี้
รูปแบบ:
adb logcat -v thread
คุณจะระบุรูปแบบเอาต์พุตได้โดยใช้ตัวเลือก -v
ได้เพียง 1 รูปแบบเท่านั้น อย่างไรก็ตาม คุณ
สามารถระบุคีย์ตัวปรับแต่งได้มากตามต้องการ ตราบใดที่คีย์นั้นเหมาะสม logcat
ละเว้นตัวแก้ไขที่ไม่สมเหตุสมผล
ตัวปรับแต่งรูปแบบ
ตัวแก้ไขรูปแบบจะเปลี่ยนเอาต์พุต logcat
หากต้องการระบุตัวแก้ไขรูปแบบ
ใช้ตัวเลือก -v
ดังนี้
adb logcat -b all -v color -d
ทุกข้อความในบันทึก Android จะมีแท็กและลําดับความสําคัญเชื่อมโยงอยู่ คุณสามารถรวมตัวปรับแต่งรูปแบบใดก็ได้กับตัวเลือกรูปแบบดังต่อไปนี้
brief
long
process
raw
tag
thread
threadtime
time
หากต้องการจัดรูปแบบรายละเอียดแป้นกดร่วมต่อไปนี้ ให้ป้อน logcat -v --help
ที่
บรรทัดคำสั่งดังนี้
color
: แสดงระดับความสำคัญแต่ละระดับด้วยสีที่ต่างกันdescriptive
: แสดงคำอธิบายเหตุการณ์บัฟเฟอร์บันทึก ตัวแก้ไขนี้ส่งผลต่อเหตุการณ์ บันทึกบัฟเฟอร์ข้อความเท่านั้น และไม่มีผลต่อบัฟเฟอร์อื่นที่ไม่ใช่ไบนารี กิจกรรม คำอธิบายมาจากฐานข้อมูลแท็กบันทึกเหตุการณ์epoch
: แสดงเวลาเป็นวินาที โดยเริ่มตั้งแต่วันที่ 1 มกราคม 1970monotonic
: แสดงเวลาเป็นวินาทีของ CPU โดยเริ่มต้นจากการเปิดเครื่องครั้งล่าสุดprintable
: ตรวจสอบว่าเนื้อหาการบันทึกไบนารีทั้งหมดหลุดเป็นอักขระหลีกuid
: หากการควบคุมการเข้าถึงอนุญาต ระบบจะแสดง UID หรือรหัส Android ของ กระบวนการที่บันทึกไว้usec
: แสดงเวลาด้วยความแม่นยำในระดับไมโครวินาทีUTC
: แสดงเวลาเป็น UTCyear
: เพิ่มปีตามเวลาที่แสดงzone
: เพิ่มเขตเวลาท้องถิ่นตามเวลาที่แสดง
ดูบัฟเฟอร์บันทึกสำรอง
ระบบการบันทึกของ Android จะเก็บบัฟเฟอร์วงกลมหลายรายการสำหรับข้อความบันทึก แต่ไม่ใช่ทั้งหมด
ข้อความบันทึกจะส่งไปยังบัฟเฟอร์วงกลมเริ่มต้น หากต้องการดูข้อความบันทึกเพิ่มเติม
เรียกใช้คำสั่ง logcat
ด้วยตัวเลือก -b
เพื่อขอให้ดู
บัฟเฟอร์วงกลมสำรอง คุณดูบัฟเฟอร์สำรองต่อไปนี้ได้
radio
: ดูบัฟเฟอร์ที่เกี่ยวข้องกับวิทยุ/โทรศัพท์ ข้อความevents
: ดูข้อความบัฟเฟอร์เหตุการณ์ของระบบไบนารีที่ตีความแล้วmain
: ดูบัฟเฟอร์บันทึกหลัก (ค่าเริ่มต้น) ซึ่งไม่มี ข้อความระบบและข้อความบันทึกข้อขัดข้องsystem
: ดูบัฟเฟอร์บันทึกของระบบ (ค่าเริ่มต้น)crash
: ดูบัฟเฟอร์บันทึกข้อขัดข้อง (ค่าเริ่มต้น)all
: ดูบัฟเฟอร์ทั้งหมดdefault
: รายงานmain
,system
และcrash
บัฟเฟอร์
การใช้งานตัวเลือก -b
มีดังนี้
[adb] logcat [-b <buffer>]
ต่อไปนี้คือตัวอย่างของวิธีดูบัฟเฟอร์ไฟล์บันทึกที่มีข้อความวิทยุและโทรศัพท์
adb logcat -b radio
หากต้องการระบุแฟล็ก -b
หลายรายการสำหรับบัฟเฟอร์ทั้งหมดที่ต้องการพิมพ์
ให้ป้อนข้อมูลต่อไปนี้
logcat -b main -b radio -b events
ระบุแฟล็ก -b
รายการเดียวที่มีรายการบัฟเฟอร์ที่คั่นด้วยคอมมา
เช่น
logcat -b main,radio,events
บันทึกจากโค้ด
ชั้นเรียน Log
ให้คุณสร้าง
รายการบันทึกในโค้ดของคุณที่แสดงในเครื่องมือ logcat
วิธีบันทึกที่พบได้ทั่วไปมีดังนี้
Log.v(String, String)
(รายละเอียด)Log.d(String, String)
(แก้ไขข้อบกพร่อง)Log.i(String, String)
(ข้อมูล)Log.w(String, String)
(คำเตือน)Log.e(String, String)
(ข้อผิดพลาด)
ตัวอย่างเช่น ในการใช้การเรียกต่อไปนี้
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
logcat
แสดงผลลัพธ์ที่คล้ายกับตัวอย่างต่อไปนี้
I/MyActivity( 1557): MyClass.getView() — get item number 1