Memahami Pencatatan

Artikel ini mencakup proses logging, termasuk standar log, pedoman level, kelas, tujuan, dan perkiraan multistack.

Standar Log

Logging di Android rumit karena campuran standar yang digunakan yang digabungkan dalam logcat . Standar utama yang digunakan dirinci di bawah ini:

Sumber Contoh Panduan tingkat tumpukan
RFC 5424 (standar syslog ) Kernel Linux, banyak aplikasi Unix Kernel, daemon sistem
android.util.Log Kerangka kerja Android + pencatatan aplikasi Kerangka kerja Android dan aplikasi sistem
java.util.logging.Level Log umum di Jawa aplikasi non-sistem

Gambar 1: Standar tingkat log.

Meskipun masing-masing standar ini memiliki konstruksi tingkat yang sama, mereka bervariasi dalam granularitas. Perkiraan setara di seluruh standar adalah sebagai berikut:

Tingkat RFC 5424 Keparahan RFC 5424 Deskripsi RFC 5424 android.util.Log java.util.logging.Level
0 Keadaan darurat Sistem tidak dapat digunakan Log.e / Log.wtf SEVERE
1 Peringatan Tindakan harus segera diambil Log.e / Log.wtf SEVERE
2 Kritis Kondisi kritis Log.e / Log.wtf SEVERE
3 Kesalahan Kondisi kesalahan Log.e SEVERE
4 Peringatan Kondisi peringatan Log.w WARNING
5 Melihat Biasa tapi signifikan Log.w WARNING
6 Info Pesan informasi Log.i INFO
7 Debug Pesan tingkat debug Log.d CONFIG , FINE
- - Pesan verbose Log.v FINER / FINEST

Gambar 2: level logging syslog , Android, dan Java.

Panduan Level Log

Ada pedoman yang diberikan untuk setiap standar log. Level log yang dipilih mengikuti standar yang sesuai yang digunakan, seperti menggunakan standar syslog untuk pengembangan kernel.

Urutan level log, dari yang paling sedikit hingga yang paling banyak, ditunjukkan dalam tiga gambar di bawah ini:

ERROR Log ini selalu disimpan.
WARN Log ini selalu disimpan.
INFO Log ini selalu disimpan.
DEBUG Log ini dikompilasi tetapi dilucuti saat runtime.
VERBOSE Log ini tidak pernah dikompilasi ke dalam aplikasi kecuali selama pengembangan.

Gambar 3: android.util.Log

CONFIG Tingkat pesan untuk pesan konfigurasi statis
FINE Tingkat pesan yang menyediakan informasi penelusuran
FINER Menunjukkan pesan penelusuran yang cukup detail
FINEST Menunjukkan pesan penelusuran yang sangat detail
INFO Tingkat pesan untuk pesan informasi
SEVERE Level pesan yang menunjukkan kegagalan serius
WARNING Level pesan yang menunjukkan potensi masalah

Gambar 4: java.util.Logging.Level .

0 Keadaan darurat Sistem tidak dapat digunakan
1 Peringatan Tindakan harus segera diambil
2 Kritis Kondisi kritis
3 Kesalahan Kondisi kesalahan
4 Peringatan Kondisi peringatan
5 Melihat Kondisi normal tapi signifikan
6 informasi Pesan informasi
7 Debug Pesan tingkat debug

Gambar 5: RFC 5424 - Bagian 6.2.1 .

Pencatatan Aplikasi

Logging selektif dilakukan dengan TAG oleh kelas android.util.Log menggunakan Log#isLoggable , seperti yang ditunjukkan di bawah ini:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

Log dapat disetel saat runtime untuk memberikan tingkat logging tertentu seperti yang ditunjukkan di bawah ini:

adb shell setprop log.tag.FOO_TAG VERBOSE

log.tag.* properti diatur ulang saat reboot. Ada varian persisten yang tetap ada di seluruh reboot juga. Lihat di bawah:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Log#isLoggable meninggalkan jejak log dalam kode aplikasi. Boolean DEBUG menandai melewati jejak log menggunakan pengoptimalan kompiler yang disetel ke false , seperti yang ditunjukkan di bawah ini:

private final static boolean DEBUG = false;

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

Logging dapat dihapus per-APK melalui aturan ProGuard oleh R8 pada waktu kompilasi. Contoh berikut menghapus semua yang ada di bawah pencatatan level INFO untuk 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

Ini berguna untuk menangani beberapa tipe build aplikasi (misalnya, build pengembangan vs. build rilis) di mana kode dasarnya diharapkan sama, tetapi level log yang diizinkan berbeda. Kebijakan eksplisit harus ditetapkan dan diikuti untuk aplikasi (khususnya aplikasi sistem) untuk memutuskan bagaimana tipe build dan ekspektasi rilis memengaruhi output log.

Sistem Logging di Android Runtime (ART)

Ada beberapa kelas yang tersedia untuk aplikasi dan layanan sistem:

Kelas Tujuan
android.telephony.Rlog Pencatatan radio
android.util.Log Pencatatan aplikasi umum
android.util.EventLog Pencatatan peristiwa diagnostik integrator sistem
android.util.Slog Pencatatan kerangka kerja platform

Gambar 6: Kelas dan tujuan log sistem yang tersedia.

Meskipun android.util.Log dan android.util.Slog menggunakan standar tingkat log yang sama, Slog adalah kelas @hide yang hanya dapat digunakan oleh platform. Level EventLog dipetakan ke entri dalam file event.logtags di /system/etc/event-log-tags .

Pencatatan Asli

Masuk C/C++ mengikuti standar syslog dengan syslog (2) sesuai dengan syslog kernel Linux yang mengontrol buffer printk , dan syslog (3) sesuai dengan logger sistem umum. Android menggunakan perpustakaan liblog untuk logging sistem umum.

liblog menyediakan pembungkus untuk grup sublog menggunakan formulir makro berikut:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD , misalnya, sesuai dengan [Radio log buffer ID] LOG [Debug Level] . Pembungkus liblog utama adalah sebagai berikut:

Kelas pembungkus Contoh fungsi
log_main.h ALOGV , ALOGW
log_radio.h RLOGD , RLOGE
log_system.h SLOGI , SLOGW

Gambar 7: pembungkus liblog .

Android memiliki antarmuka tingkat yang lebih tinggi untuk logging yang lebih disukai daripada penggunaan liblog langsung, seperti yang terlihat di bawah ini:

Perpustakaan Penggunaan
async_safe Pustaka hanya untuk masuk dari lingkungan aman-sinyal-async
libbase Pustaka logging yang menyediakan antarmuka aliran C++ untuk logging, mirip dengan logging gaya Google (glog). libbase dapat digunakan di kedua proyek eksternal dan tersedia di aplikasi yang menggunakan libbase_ndk .

Gambar 8: Library log level lebih tinggi.

Perkiraan Multistack

Karena perbedaan dalam perincian dan maksud level, tidak ada pencocokan yang jelas atau tepat dari standar logging yang berbeda. Misalnya, level java.util.logging.Level dan android.util.Log untuk log kesalahan tidak cocok dengan 1:1:

java.util.Logging.Level android.util.Log
PARAH Log.wtf
PARAH Log.e

Gambar 9: Tingkat kesalahan dalam logging Java standar vs. logging Android.

Dalam kasus seperti ini, gunakan standar individu untuk menentukan level mana yang akan diterapkan.

Selama pengembangan sistem dengan beberapa komponen tingkat tumpukan, ikuti Gambar 1 untuk menentukan standar mana yang akan digunakan per komponen. Untuk panduan perkiraan untuk pesan tingkat, ikuti Gambar 2.

Keamanan dan Privasi

Jangan mencatat Informasi Identifikasi Pribadi (PII). Ini termasuk detail seperti:

  • Alamat email
  • Nomor telepon
  • Nama-nama

Demikian pula, detail tertentu dianggap sensitif bahkan jika tidak secara eksplisit dapat diidentifikasi secara pribadi.

Misalnya, meskipun info zona waktu tidak dianggap sebagai identitas pribadi, hal itu memberikan indikasi perkiraan lokasi pengguna.

Kebijakan log dan detail yang dapat diterima harus ditangani sebagai bagian dari tinjauan keamanan dan privasi sebelum dirilis.