บทความนี้ครอบคลุมกระบวนการบันทึก รวมถึงมาตรฐานการบันทึก หลักเกณฑ์ระดับ คลาส วัตถุประสงค์ และการประมาณค่าแบบหลายสแต็ก
มาตรฐานบันทึก
การบันทึกใน Android มีความซับซ้อนเนื่องจากทั้งมาตรฐานที่ใช้ซึ่ง
รวมกันใน logcat
มาตรฐานหลักๆ ที่ใช้มีรายละเอียดดังนี้
แหล่งที่มา | ตัวอย่าง | คำแนะนำสำหรับระดับสแต็ก |
---|---|---|
RFC 5424 (มาตรฐาน syslog ) |
เคอร์เนลของ Linux, แอป Unix จำนวนมาก | เคอร์เนล, Daemons ของระบบ |
android.util.Log |
เฟรมเวิร์ก Android + การบันทึกแอป | เฟรมเวิร์ก Android และแอประบบ |
java.util.logging.Level |
การบันทึกทั่วไปใน Java | แอปที่ไม่ใช่ระบบ |
รูปที่ 1: มาตรฐานระดับบันทึก
แม้ว่ามาตรฐานเหล่านี้จะมีลักษณะระดับใกล้เคียงกัน แต่ก็มีความแตกต่างกันในเรื่องต่อไปนี้ รายละเอียด ค่าเทียบเท่าโดยประมาณของมาตรฐานต่างๆ มีดังนี้
ระดับ RFC 5424 | ความรุนแรงของ RFC 5424 | คำอธิบาย RFC 5424 | android.util.Log | java.util.logging.Level |
---|---|---|---|---|
0 | ฉุกเฉิน | ระบบใช้งานไม่ได้ | Log.e / Log.wtf |
SEVERE |
1 | การแจ้งเตือน | ต้องดำเนินการทันที | Log.e / Log.wtf |
SEVERE |
2 | วิกฤต | ภาวะวิกฤต | Log.e / Log.wtf |
SEVERE |
3 | ข้อผิดพลาด | เงื่อนไขข้อผิดพลาด | Log.e |
SEVERE |
4 | คำเตือน | เงื่อนไขคําเตือน | Log.w |
WARNING |
5 | ประกาศ | ปกติแต่มีนัยสำคัญ | Log.w |
WARNING |
6 | ข้อมูล | การรับส่งข้อความข้อมูล | Log.i |
INFO |
7 | แก้ไขข้อบกพร่อง | ข้อความระดับแก้ไขข้อบกพร่อง | Log.d |
CONFIG , FINE |
- | - | การรับส่งข้อความแบบละเอียด | Log.v |
FINER / FINEST |
รูปที่ 2: ระดับการบันทึกของ syslog
, Android และ Java
หลักเกณฑ์ระดับบันทึก
มาตรฐานบันทึกแต่ละมาตรฐานมีหลักเกณฑ์อยู่แล้ว บันทึกที่เลือก
เป็นไปตามมาตรฐานที่เหมาะสม เช่น การใช้ syslog
สำหรับการพัฒนาเคอร์เนล
ลำดับระดับบันทึกจากน้อยไปมากจะแสดงในตัวเลข 3 รูปด้านล่างนี้
ERROR |
โดยจะเก็บบันทึกเหล่านี้ไว้เสมอ |
WARN |
โดยจะเก็บบันทึกเหล่านี้ไว้เสมอ |
INFO |
โดยจะเก็บบันทึกเหล่านี้ไว้เสมอ |
DEBUG |
บันทึกเหล่านี้จะได้รับการคอมไพล์ แต่จะถูกตัดทอนขณะรันไทม์ |
VERBOSE |
บันทึกเหล่านี้จะไม่รวบรวมลงในแอป ยกเว้นในระหว่าง ที่กำลังพัฒนา |
รูปที่ 3: android.util.Log
CONFIG |
ระดับข้อความสำหรับข้อความการกำหนดค่าแบบคงที่ |
FINE |
ระดับข้อความที่ให้ข้อมูลการติดตาม |
FINER |
ระบุข้อความการติดตามที่มีรายละเอียดพอสมควร |
FINEST |
ระบุข้อความการติดตามโดยละเอียด |
INFO |
ระดับข้อความของข้อความแจ้งข้อมูล |
SEVERE |
ระดับข้อความที่แสดงว่าเกิดข้อผิดพลาดร้ายแรง |
WARNING |
ระดับข้อความที่แสดงว่าอาจเป็นปัญหา |
รูปที่ 4: java.util.Logging.Level
0 | ฉุกเฉิน | ระบบใช้งานไม่ได้ |
1 | การแจ้งเตือน | ต้องดำเนินการทันที |
2 | วิกฤต | ภาวะวิกฤต |
3 | ข้อผิดพลาด | เงื่อนไขข้อผิดพลาด |
4 | คำเตือน | เงื่อนไขคําเตือน |
5 | ประกาศ | ภาวะปกติแต่มีนัยสำคัญ |
6 | ข้อมูลความรู้ | ข้อความแจ้งข้อมูล |
7 | แก้ไขข้อบกพร่อง | ข้อความระดับแก้ไขข้อบกพร่อง |
รูปที่ 5: RFC 5424
- ส่วน
6.2.1
การบันทึกแอป
การบันทึกเฉพาะส่วนดำเนินการกับ TAG
โดย android.util.Log
ชั้นเรียนโดยใช้ Log#isLoggable
ดังที่แสดงด้านล่าง
if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) { Log.v("FOO_TAG", "Message for logging."); } |
---|
คุณจะปรับแต่งบันทึกขณะรันไทม์ได้เพื่อระบุระดับการบันทึกที่เลือก ดังที่ปรากฏ ด้านล่าง
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
พร็อพเพอร์ตี้ log.tag.*
รายการจะรีเซ็ตเมื่อรีบูต มี
ตัวแปรถาวรที่ยังคงอยู่ในช่วงรีบูตด้วย โปรดดูด้านล่าง
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
การตรวจสอบ Log#isLoggable
จะทิ้งการติดตามในโค้ดของแอปไว้ บูลีน
แฟล็ก DEBUG
จะข้ามการติดตามบันทึกโดยใช้การเพิ่มประสิทธิภาพคอมไพเลอร์ที่ตั้งค่าเป็น
false
ตามที่แสดงด้านล่าง
private final static boolean DEBUG = false; |
---|
คุณนำการบันทึกออกได้ตาม APK ผ่านชุดกฎ ProGuard ภายในวันที่ R8
เวลา
เวลาคอมไพล์ ตัวอย่างต่อไปนี้จะนําทุกอย่างที่อยู่ต่ำกว่าระดับ INFO
ออก
การบันทึกสำหรับ android.util.Log
:
# This allows proguard to strip isLoggable() blocks containing only <=INFO log # code from release builds. -assumenosideeffects class android.util.Log { static *** i(...); static *** d(...); static *** v(...); static *** isLoggable(...); } -maximumremovedandroidloglevel 4 |
---|
ซึ่งมีประโยชน์ในการจัดการบิลด์ของแอปหลายประเภท (สำหรับ เช่น เวอร์ชันการพัฒนากับเวอร์ชันการเผยแพร่) โดยที่โค้ดพื้นฐานคือ ควรเหมือนกัน แต่ระดับการบันทึกที่อนุญาตต่างกัน โจ่งแจ้ง ต้องตั้งค่าและปฏิบัติตามนโยบายสำหรับแอป (โดยเฉพาะระบบ เพื่อตัดสินใจว่าประเภทบิลด์และความคาดหวังของการเผยแพร่จะส่งผลอย่างไรต่อบันทึก เอาต์พุต
การบันทึกระบบใน Android Runtime (ART)
มีชั้นเรียนจำนวนมากที่พร้อมใช้งานสำหรับระบบ แอปและบริการ
ชั้นเรียน | วัตถุประสงค์ |
---|---|
android.telephony.Rlog |
การบันทึกวิทยุ |
android.util.Log |
การบันทึกแอปทั่วไป |
android.util.EventLog |
การบันทึกเหตุการณ์วินิจฉัยผู้รวมระบบ |
android.util.Slog |
การบันทึกเฟรมเวิร์กแพลตฟอร์ม |
รูปที่ 6: คลาสและวัตถุประสงค์ของบันทึกของระบบที่ใช้ได้
แม้ว่า android.util.Log
และ android.util.Slog
จะใช้ระดับการบันทึกเดียวกัน
Slog
เป็นคลาส @hide
ที่ใช้ได้โดยแพลตฟอร์มเท่านั้น EventLog
ระดับต่างๆ ได้จับคู่กับรายการใน event.logtags
ใน /system/etc/event-log-tags
การบันทึกของระบบ
การบันทึกใน C/C++ เป็นไปตามมาตรฐาน syslog
ที่มี syslog
(2) ที่สอดคล้องกับ
เคอร์เนลของ Linux syslog
ที่ควบคุมบัฟเฟอร์ printk
และ syslog
(3)
ตามบันทึกระบบทั่วไป Android ใช้ liblog
สำหรับการบันทึกระบบทั่วไป
liblog
ระบุ Wrapper สำหรับกลุ่มบันทึกย่อยโดยใช้มาโครต่อไปนี้
แบบฟอร์ม:
[Sublog Buffer ID] LOG [Log Level ID] |
ตัวอย่างเช่น RLOGD
สอดคล้องกับ [Radio log buffer ID] LOG [Debug Level]
Wrapper ของ liblog
หลักมีดังนี้
คลาส Wrapper | ตัวอย่างฟังก์ชัน |
---|---|
log_main.h |
ALOGV , ALOGW |
log_radio.h |
RLOGD , RLOGE |
log_system.h |
SLOGI , SLOGW |
รูปที่ 7: liblog
Wrapper
Android มีอินเทอร์เฟซระดับสูงกว่าสำหรับการบันทึกซึ่งชื่นชอบมากกว่าโดยตรง
การใช้งาน liblog
ดังที่แสดงด้านล่าง
คลัง | การใช้งาน |
---|---|
async_safe |
ไลบรารีสำหรับการบันทึกจากสภาพแวดล้อมที่ไม่ละเมิดสัญญาณแบบไม่พร้อมกันเท่านั้น |
libbase |
ไลบรารีการบันทึกที่มีอินเทอร์เฟซสตรีม C++ สำหรับการบันทึก ซึ่งคล้ายกับ
การบันทึกสไตล์ Google (glog) libbase ใช้ได้ในทั้งโปรเจ็กต์ภายนอก
และใช้ได้ในแอปที่ใช้ libbase_ndk |
รูปที่ 8: ไลบรารีบันทึกระดับสูงขึ้น
ค่าประมาณของ Multistack
เนื่องจากรายละเอียดและความตั้งใจในแต่ละระดับแตกต่างกัน จึงไม่มีคำอธิบายที่ชัดเจนหรือ
การจับคู่ที่ตรงกันทั้งหมดของมาตรฐานการบันทึกต่างๆ ตัวอย่างเช่น พารามิเตอร์
ระดับ java.util.logging.Level
และ android.util.Log
สำหรับบันทึกข้อผิดพลาดไม่ใช่
จับคู่แบบ 1:1:
java.util.Laking.Level | android.util.Log |
---|---|
แยกต่างหาก | Log.wtf |
แยกต่างหาก | Log.e |
รูปที่ 9: ระดับข้อผิดพลาดในการบันทึก Java มาตรฐานเทียบกับ Android การเข้าสู่ระบบ
ในกรณีเช่นนี้ ให้ใช้มาตรฐานแต่ละรายการเพื่อพิจารณาว่าระดับใด
สมัคร
ในระหว่างการพัฒนาระบบด้วยคอมโพเนนต์ระดับสแต็กหลายรายการ โปรดทำตาม รูปที่ 1 เพื่อกำหนดว่าจะใช้มาตรฐานใดต่อคอมโพเนนต์ สำหรับค่าประมาณ สำหรับการจัดข้อความตามลำดับชั้น ทำตามรูปที่ 2
ความปลอดภัยและความเป็นส่วนตัว
อย่าบันทึกข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) ช่วงเวลานี้ มีรายละเอียด เช่น
- อีเมล
- หมายเลขโทรศัพท์
- ชื่อ
ในทำนองเดียวกัน รายละเอียดบางอย่างถือว่าเป็นข้อมูลที่ละเอียดอ่อน ระบุตัวตนได้อย่างแน่ชัด
เช่น แม้ข้อมูลเขตเวลาจะไม่ถือว่าเป็นข้อมูลที่ระบุตัวตนได้
จะบอกตำแหน่งโดยประมาณของผู้ใช้
ต้องจัดการนโยบายการบันทึกและรายละเอียดที่ยอมรับได้เพื่อรักษาความปลอดภัยและ การตรวจสอบความเป็นส่วนตัวก่อนเผยแพร่
บันทึกของอุปกรณ์
เข้าถึงบันทึกทั้งหมดของอุปกรณ์ รวมถึงการใช้
android.permission.READ_LOGS
ถูกจำกัด:
- หากแอปในเบื้องหลังขอเข้าถึงบันทึกทั้งหมดของอุปกรณ์ คำขอจะดำเนินการโดยอัตโนมัติ ปฏิเสธ เว้นแต่แอปจะมีลักษณะดังนี้
- แชร์ UID ของระบบ
- ใช้กระบวนการของระบบดั้งเดิม (
UID
<APP_UID
) - ใช้
DropBoxManager
- เข้าถึงเฉพาะบัฟเฟอร์บันทึกเหตุการณ์
- ใช้
EventLog
API - ใช้การทดสอบแบบมีเครื่องวัด
- หากแอปในเบื้องหน้าที่มี
READ_LOGS
ขอสิทธิ์เข้าถึงบันทึกของอุปกรณ์ ระบบจะแจ้งให้ผู้ใช้อนุมัติหรือปฏิเสธคำขอเข้าถึง