ทำความเข้าใจการบันทึก

บทความนี้ครอบคลุมกระบวนการบันทึก รวมถึงมาตรฐานการบันทึก หลักเกณฑ์ระดับ คลาส วัตถุประสงค์ และการประมาณค่าแบบหลายสแต็ก

มาตรฐานบันทึก

การบันทึกใน 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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

คุณนำการบันทึกออกได้ตาม 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 ขอสิทธิ์เข้าถึงบันทึกของอุปกรณ์ ระบบจะแจ้งให้ผู้ใช้อนุมัติหรือปฏิเสธคำขอเข้าถึง