เครื่องมือบรรทัดคำสั่ง Logcat

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: แสดงเฉพาะ PID
    • raw: แสดงข้อความบันทึกดิบที่ไม่มีช่องข้อมูลเมตาอื่นๆ
    • 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 มกราคม 1970
    • monotonic: แสดงเวลาเป็นวินาทีของ CPU โดยเริ่มต้นจากการเปิดเครื่องครั้งล่าสุด
    • printable: ตรวจสอบว่าเนื้อหาการบันทึกไบนารีทั้งหมดหลุดเป็นอักขระหลีก
    • uid: หากการควบคุมการเข้าถึงอนุญาต ระบบจะแสดง UID หรือรหัส Android ของ กระบวนการที่บันทึกไว้
    • usec: แสดงเวลาด้วยความแม่นยำในระดับไมโครวินาที
    • UTC: แสดงเวลาเป็น UTC
    • year: เพิ่มปีตามเวลาที่แสดง
    • 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 วิธีบันทึกที่พบได้ทั่วไปมีดังนี้

    ตัวอย่างเช่น ในการใช้การเรียกต่อไปนี้

    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