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

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

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

การเข้าสู่ระบบใน Android นั้นซับซ้อนเนื่องจากการผสมผสานของมาตรฐานที่ใช้ซึ่งรวมอยู่ใน logcat มาตรฐานหลักที่ใช้มีรายละเอียดด้านล่าง:

แหล่งที่มา ตัวอย่าง คำแนะนำระดับกอง
RFC 5424 (มาตรฐาน syslog ) เคอร์เนล Linux แอปพลิเคชั่น Unix มากมาย เคอร์เนล, ระบบภูต
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 สำหรับการพัฒนาเคอร์เนล

คำสั่งระดับล็อก จากน้อยไปมาก แสดงในรูปสามรูปด้านล่าง:

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 การตรวจสอบทิ้งร่องรอยบันทึกในรหัสแอปพลิเคชัน Boolean 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) ที่สอดคล้องกับ syslog เคอร์เนลของ Linux ที่ควบคุมบัฟเฟอร์ printk และ syslog (3) ที่สอดคล้องกับตัวบันทึกระบบทั่วไป Android ใช้ไลบรารี liblog สำหรับการบันทึกระบบทั่วไป

liblog จัดเตรียม wrappers สำหรับกลุ่มบันทึกย่อยโดยใช้รูปแบบมาโครต่อไปนี้:

[Sublog Buffer ID] LOG [Log Level ID]

ตัวอย่างเช่น RLOGD สอดคล้องกับ [Radio log buffer ID] LOG [Debug Level] wrappers liblog ที่สำคัญมีดังนี้:

ชั้นห่อ ตัวอย่างฟังก์ชัน
log_main.h ALOGV , ALOGW
log_radio.h RLOGD , RLOGE
log_system.h SLOGI , SLOGW

รูปที่ 7: ตัวห่อ liblog

Android มีอินเทอร์เฟซระดับสูงกว่าสำหรับการบันทึกซึ่งได้รับการสนับสนุนมากกว่าการใช้ liblog โดยตรง ดังที่แสดงด้านล่าง:

ห้องสมุด การใช้งาน
async_safe ไลบรารีสำหรับการบันทึกจากสภาพแวดล้อมแบบ async-signal-safe เท่านั้น
libbase ไลบรารีการบันทึกที่มีอินเทอร์เฟซสำหรับสตรีม C++ สำหรับการบันทึก คล้ายกับการบันทึกแบบ Google (glog) libbase สามารถใช้ได้ทั้งในโปรเจ็กต์ภายนอกและพร้อมใช้งานในแอปพลิเคชันโดยใช้ libbase_ndk

รูปที่ 8: ไลบรารีบันทึกระดับสูง

การประมาณค่าแบบหลายสแต็ก

เนื่องจากความแตกต่างในด้านความละเอียดและระดับความตั้งใจ จึงไม่มีความชัดเจนหรือตรงกันทุกประการของมาตรฐานการบันทึกที่แตกต่างกัน ตัวอย่างเช่น ระดับ java.util.logging.Level และ android.util.Log สำหรับบันทึกข้อผิดพลาดไม่ตรงกันแบบ 1:1:

java.util.Logging.Level android.util.Log
รุนแรง Log.wtf
รุนแรง Log.e

รูปที่ 9: ระดับข้อผิดพลาดในการบันทึก Java มาตรฐานกับการบันทึก Android

ในกรณีเช่นนี้ ให้ใช้มาตรฐานส่วนบุคคลเพื่อกำหนดระดับที่จะใช้

ในระหว่างการพัฒนาระบบที่มีส่วนประกอบหลายระดับสแต็ก ให้ทำตามรูปที่ 1 เพื่อกำหนดว่าจะใช้มาตรฐานใดต่อหนึ่งองค์ประกอบ สำหรับคำแนะนำโดยประมาณในการส่งข้อความตามระดับ ให้ทำตาม รูปที่ 2

ความปลอดภัยและความเป็นส่วนตัว

อย่าบันทึกข้อมูลส่วนบุคคลที่สามารถระบุตัวตนได้ (PII) ซึ่งรวมถึงรายละเอียดเช่น:

  • ที่อยู่อีเมล
  • หมายเลขโทรศัพท์
  • ชื่อ

ในทำนองเดียวกัน รายละเอียดบางอย่างถือว่าละเอียดอ่อนแม้ว่าจะไม่สามารถระบุตัวบุคคลได้อย่างชัดเจนก็ตาม

ตัวอย่างเช่น แม้ว่าข้อมูลเขตเวลาจะไม่ถือว่าสามารถระบุตัวบุคคลได้ แต่ก็ให้การระบุตำแหน่งโดยสังเขปของผู้ใช้

นโยบายบันทึกและรายละเอียดที่ยอมรับได้ต้องได้รับการจัดการโดยเป็นส่วนหนึ่งของการตรวจสอบความปลอดภัยและความเป็นส่วนตัวก่อนเผยแพร่