Logcat เป็นเครื่องมือ Android SDK สำหรับดูข้อความระบบและล็อกแอปพลิเคชันแบบเรียลไทม์ สามารถเข้าถึงได้ผ่าน ADB หรือคอนโซลในตัวของ Android Studio ตาม Android Developers Logcat จะรวบรวมข้อความจากกระบวนการทั้งหมดของระบบ กรองตามระดับความสำคัญและแท็ก และช่วยให้นักพัฒนาวินิจฉัยข้อผิดพลาด ติดตามการทำงานของโค้ด และวิเคราะห์ประสิทธิภาพ Logcat เป็นแหล่งข้อมูลหลักเมื่อดีบักแอปพลิเคชัน Android
ประเด็นสำคัญ
Logcat คือบัฟเฟอร์ระบบ Android ที่กระบวนการทั้งหมด (รวมถึงเคอร์เนล Linux, system_server และแอปพลิเคชัน) เขียนข้อความในรูปแบบเฉพาะ เครื่องมือ logcat ที่รวมอยู่ใน Android SDK จะอ่านบัฟเฟอร์นี้และแสดงข้อความแบบเรียลไทม์ เริ่มตั้งแต่ Android 4.1 (API 16) การเข้าถึง Logcat ถูกจำกัด: แอปพลิเคชันสามารถอ่านได้เฉพาะล็อกของตนเอง และล็อกระบบสามารถเข้าถึงได้ผ่าน ADB ด้วยสิทธิ์การดีบัก
แต่ละ ข้อความ Logcat ประกอบด้วยห้าฟิลด์: วันที่และเวลา, PID (ตัวระบุกระบวนการ), TID (ตัวระบุเธรด), ระดับล็อก และแท็ก รูปแบบคงที่และเหมือนกันทุกเวอร์ชัน Android ซึ่งช่วยให้ใช้ยูทิลิตี้ grep, awk และ sed สำหรับการกรองล็อกในไปป์ไลน์ CI/CD โดยไม่ต้องพึ่งพา IDE
ล็อก จะถูกเก็บไว้ในบัฟเฟอร์วงแหวนขนาดคงที่: 256 KB สำหรับ main, 256 KB สำหรับ system และ 256 KB สำหรับ events (Android 5+) เมื่อบัฟเฟอร์ล้น ข้อความเก่าจะถูกลบ นักพัฒนาสามารถเปลี่ยนขนาดบัฟเฟอร์ได้ผ่านคุณสมบัติ PROP logcat.size หรือในตัวเลือกนักพัฒนาของอุปกรณ์
หกระดับ การบันทึกกำหนดความสำคัญของข้อความ Android ใช้ระดับมาตรฐานคล้ายกับแพลตฟอร์มอื่น ๆ แต่ใช้ชื่อค่าคงที่ของตัวเองในคลาส Log การเลือกระดับที่ถูกต้องช่วยกรองล็อกอย่างมีประสิทธิภาพและป้องกันไม่ให้ข้อความสำคัญจมอยู่ท่ามกลางข้อความรอง
| ระดับ | ค่าคงที่ | วัตถุประสงค์ | แสดงโดยค่าเริ่มต้น |
|---|---|---|---|
| VERBOSE | Log.v | ข้อมูลการดีบักโดยละเอียดสูงสุด | ไม่ |
| DEBUG | Log.d | ข้อความดีบักสำหรับนักพัฒนา | ไม่ |
| INFO | Log.i | ข้อความข้อมูลเกี่ยวกับการทำงานของแอปพลิเคชัน | ใช่ |
| WARN | Log.w | คำเตือนเกี่ยวกับปัญหาที่อาจเกิดขึ้น | ใช่ |
| ERROR | Log.e | ข้อผิดพลาดร้ายแรงและข้อยกเว้น | ใช่ |
| ASSERT | Log.wtf | ข้อผิดพลาดที่ไม่ควรเกิดขึ้นโดยหลักการ | ใช่ |
แท็ก (tag) — สตริงสูงสุด 23 อักขระที่ระบุแหล่งที่มาของข้อความ แนะนำให้ใช้ชื่อคลาสหรือโมดูลเป็นแท็ก: MainActivity, AuthManager, NetworkModule ซึ่งช่วยให้กรองล็อกตามคอมโพเนนต์เฉพาะของแอปพลิเคชัน เพื่อความสอดคล้องในทีม คุณสามารถสร้างค่าคงที่แท็กในไฟล์แยกต่างหากหรือใช้ไลบรารี Timber ซึ่งจะแทรกแท็กโดยอัตโนมัติตามชื่อคลาส
เมื่อเกิด ข้อยกเว้นที่ไม่ถูกจัดการ Android จะเขียน stack trace เต็มรูปแบบลงใน Logcat โดยอัตโนมัติ โดยระบุคลาส เมธอด บรรทัดโค้ด และห่วงโซ่การเรียก ล็อกข้อขัดข้องประกอบด้วยประเภทข้อยกเว้น (NullPointerException, RuntimeException) ข้อความ และลำดับการเรียกจากจุดข้อขัดข้องไปยังจุดเริ่มต้นของแอปพลิเคชัน สำหรับการวิเคราะห์ล็อกข้อขัดข้องจากอุปกรณ์ของผู้ใช้ จะใช้ Firebase Crashlytics ซึ่งซิงโครไนซ์ stack trace กับแผนที่การทำให้สับสน (mapping.txt สำหรับ Android)
Android Studio มีอินเทอร์เฟซกราฟิก Logcat ที่เข้าถึงได้ผ่าน View → Tool Windows → Logcat (Alt + 6) หน้าต่าง Logcat อัปเดตแบบเรียลไทม์ แสดงข้อความทั้งหมดจากอุปกรณ์ที่เชื่อมต่อ และช่วยให้กำหนดค่าตัวกรองที่ยืดหยุ่นเพื่อแยกข้อมูลที่ต้องการออกจากสตรีมทั่วไป
รายการดรอปดาวน์ Log Level กรองข้อความตามระดับต่ำสุด: เลือก WARN เพื่อดูเฉพาะคำเตือนและข้อผิดพลาด โดยซ่อน VERBOSE, DEBUG และ INFO ช่องค้นหาช่วยให้ค้นหาตามข้อความหรือแท็ก — รองรับ regex ซึ่งสะดวกสำหรับการค้นหาข้อความตามรูปแบบ
Saved Filters — ฟีเจอร์ที่มีประสิทธิภาพของ Logcat ใน Android Studio คุณสามารถสร้างตัวกรองที่แสดงเฉพาะข้อความที่มีแท็กของแอปพลิเคชัน (tag:MyApp) และระดับ WARN+ ตัวกรองจะถูกเก็บไว้ระหว่างเซสชันและสามารถใช้ได้จากรายการดรอปดาวน์ สำหรับโปรเจกต์ที่มีหลายโมดูล ให้สร้างตัวกรองแยกต่างหากสำหรับแต่ละโมดูล
# นิพจน์ตัวอย่างสำหรับการกรองล็อกแอปพลิเคชัน
tag:"MyApp" level:WARN # เฉพาะ WARN+ สำหรับ MyApp
package:"com.mycompany" # บันทึกทั้งหมดของแพ็กเกจ
-tag:"okhttp" # ไม่รวมบันทึกของ OkHttp
ล็อก Logcat สามารถส่งออกเป็นไฟล์ข้อความผ่านไอคอน Save to File ซึ่งมีประโยชน์สำหรับแนบไปกับตั๋วใน Jira หรือวิเคราะห์เซสชันที่ยาวนาน ล็อกที่ส่งออกสามารถเปิดได้ในโปรแกรมแก้ไขข้อความใด ๆ และใช้ grep เพื่อค้นหารูปแบบ สำหรับการดูแบบจัดรูปแบบ ให้ใช้ยูทิลิตี้ logcat-color
ADB logcat — เวอร์ชันคอนโซลของ Logcat ที่เข้าถึงได้ผ่าน Android Debug Bridge ข้อได้เปรียบหลักคือความสามารถในการทำงานบนเซิร์ฟเวอร์ CI ในสคริปต์อัตโนมัติ และบนอุปกรณ์ที่ไม่มี Android Studio ADB logcat รองรับตัวกรองทั้งหมดเดียวกันกับ GUI แต่มีความยืดหยุ่นของบรรทัดคำสั่ง
คำสั่ง adb logcat โดยไม่มีอาร์กิวเมนต์จะแสดงบัฟเฟอร์ทั้งหมดแบบเรียลไทม์ ใช้ Ctrl+C เพื่อหยุด แฟล็ก -c จะล้างบัฟเฟอร์ก่อนเริ่มบันทึก — สะดวกเมื่อคุณต้องการแยกล็อกของการทดสอบปัจจุบันจากข้อความก่อนหน้า แฟล็ก -b จะเลือกประเภทบัฟเฟอร์: main, system, events, crash (Android 12+)
# ล้างบัฟเฟอร์และเริ่มบันทึกล็อกด้วยแท็ก MyApp
adb logcat -c
adb logcat MyApp:D *:S
# บันทึกล็อกเป็นไฟล์
adb logcat -d > logcat_dump.txt
# การกรองตาม PID ของกระบวนการ
adb logcat --pid=12345
การรวม ADB กับยูทิลิตี้ Unix ให้ความยืดหยุ่นสูงสุด ตัวอย่างเช่น ตัวกรอง "*:S TAG:D" จะแสดงเฉพาะข้อความที่มีแท็ก TAG ระดับ DEBUG ขึ้นไป โดยซ่อนข้อความอื่นทั้งหมด หากต้องการดูเฉพาะข้อยกเว้น ให้ใช้ grep -i exception หากต้องการวิเคราะห์ความถี่ของข้อผิดพลาด ให้ใช้ sort | uniq -c ที่คอลัมน์แท็ก
บน เซิร์ฟเวอร์ CI จะใช้ Logcat เพื่อรวบรวมการวินิจฉัยระหว่างการทดสอบ UI ไปป์ไลน์ทั่วไป: ล้างบัฟเฟอร์ก่อนเรียกใช้การทดสอบ บันทึกดัมพ์ล็อกเป็นอาร์ติแฟกต์ของการสร้างหลังจากดำเนินการทดสอบ หากการทดสอบล้มเหลว ล็อกสามารถระบุได้ว่าความล้มเหลวนั้นเกิดจาก ANR ข้อยกเว้นที่ไม่ถูกจัดการ หรือการหมดเวลาเครือข่าย
คลาส android.util.Log — API ในตัวสำหรับเขียนข้อความลงใน Logcat Log.v, Log.d, Log.i, Log.w, Log.e และ Log.wtf รับแท็ก (สตริง) และข้อความ (สตริง) หรือข้อความ + Throwable สำหรับการจัดรูปแบบข้อความ ให้ใช้ String.format หรือเทมเพลตสตริง Kotlin — หลีกเลี่ยงการต่อสตริงซึ่งสร้างอ็อบเจกต์ที่ไม่จำเป็นในฮีป
Timber — ไลบรารียอดนิยมโดย Jake Wharton ที่แก้ไขข้อบกพร่องของ Log API ในตัว Timber จะแทรกแท็กโดยอัตโนมัติตามชื่อคลาสที่เรียกการบันทึกและไม่ต้องส่งแท็กในการเรียกทุกครั้ง Timber ยังรองรับการบันทึกแบบมีเงื่อนไข: ในบิลด์ Release การเรียก Timber.v และ Timber.d สามารถปิดใช้งานได้ด้วยบรรทัดเดียวใน Application.onCreate
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Log API ในตัว
Log.d("MainActivity", "onCreate called")
// Timber — แท็กอัตโนมัติตามชื่อคลาส
Timber.d("onCreate called")
}
private fun loadData() {
try {
val result = fetchFromNetwork()
Timber.i("Data loaded: $result")
} catch (e: IOException) {
Timber.e(e, "Failed to load data")
}
}
}
ใน บิลด์ Release แนะนำให้ปิดการใช้งานล็อก VERBOSE และ DEBUG เพื่อลดภาระบนบัฟเฟอร์ Logcat และป้องกันการรั่วไหลของข้อมูลที่ละเอียดอ่อน Timber แก้ปัญหานี้ด้วย PlantingTree: ในรูปแบบ Debug จะปลูก DebugTree (บันทึกทุกอย่าง) ใน Release — CrashReportingTree (บันทึกเฉพาะ ERROR ผ่าน Crashlytics) Log API ในตัวไม่รองรับการบันทึกแบบมีเงื่อนไข — นักพัฒนาต้องห่อแต่ละการเรียกด้วย if (BuildConfig.DEBUG)
คำถามที่พบบ่อย
ใช้ คำสั่ง adb logcat -c ก่อนเรียกใช้การทดสอบ หรือใน Android Studio ให้คลิกปุ่ม Clear Logcat (ถังขยะ) ในหน้าต่าง Logcat การล้างไม่มีผลกับบัฟเฟอร์ระบบของกระบวนการอื่น มีผลเฉพาะกับการเชื่อมต่อปัจจุบันเท่านั้น
ดำเนินการ adb logcat -G 2M เพื่อเพิ่มบัฟเฟอร์เป็น 2 MB ขนาดสูงสุดขึ้นอยู่กับอุปกรณ์: บน Android 10+ สามารถใช้ได้สูงสุด 16 MB การเปลี่ยนแปลงจะคงอยู่จนกว่าจะรีบูตอุปกรณ์ สำหรับการกำหนดค่าถาวร ให้ใช้ build.prop ใน device tree
สาเหตุที่เป็นไปได้: แอปพลิเคชันทำงานในโหมด Release (ล็อก Timber.v/d ถูกปิดใช้งาน) ตัวกรอง Logcat ซ่อนระดับที่ต้องการ หรือคุณเชื่อมต่อกับอุปกรณ์ผิด ตรวจสอบด้วยว่าคุณเลือกกระบวนการของแอปพลิเคชันใน Android Studio ไม่ใช่ system_process
ค้นหา บรรทัด ที่มี FATAL EXCEPTION ซึ่งด้านล่างมี stack trace เต็มรูปแบบ บรรทัดแรกประกอบด้วยประเภทข้อยกเว้นและข้อความ บรรทัดถัดไปประกอบด้วยห่วงโซ่การเรียกพร้อมไฟล์และบรรทัดโค้ด ใช้ grep "FATAL EXCEPTION" สำหรับการค้นหาอย่างรวดเร็วในล็อกทั้งหมด
ANR (Application Not Responding) — สถานการณ์ที่เธรดหลัก (UI thread) ถูกบล็อกนานกว่า 5 วินาที ใน Logcat ANR จะปรากฏเป็นข้อความที่มีแท็ก ActivityManager และข้อความ "ANR in ..." พร้อม stack trace ที่แนบมาของเธรดทั้งหมด ใช้ตัวกรอง tag:ActivityManager level:ERROR
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม