Memahami logging

Artikel ini membahas proses logging, termasuk standar log, panduan level, class, tujuan, dan perkiraan multi-stack.

Standar log

Logging di Android bersifat kompleks karena campuran standar yang digunakan digabungkan dalam logcat. Standar utama yang digunakan dijelaskan di bawah ini:

Sumber Contoh Panduan tingkat stack
RFC 5424 (standar syslog) Kernel Linux, banyak aplikasi Unix Kernel, daemon sistem
android.util.Log Framework Android + logging aplikasi Framework Android dan aplikasi sistem
java.util.logging.Level Logging umum di Java aplikasi non-sistem

Gambar 1: Standar tingkat log.

Meskipun setiap standar ini memiliki konstruksi tingkat yang serupa, tingkat granularitasnya bervariasi. Perkiraan yang 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 Pemberitahuan Tindakan harus segera dilakukan Log.e / Log.wtf SEVERE
2 Kritis Kondisi kritis Log.e / Log.wtf SEVERE
3 Error Kondisi error Log.e SEVERE
4 Peringatan Kondisi peringatan Log.w WARNING
5 Pemberitahuan Normal tetapi signifikan Log.w WARNING
6 Info Pesan informasi Log.i INFO
7 Debug Pesan tingkat debug Log.d CONFIG, FINE
- - Pesan panjang Log.v FINER/FINEST

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

Panduan level log

Ada panduan 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 paling banyak, ditampilkan dalam tiga gambar di bawah:

ERROR Log ini selalu disimpan.
WARN Log ini selalu disimpan.
INFO Log ini selalu disimpan.
DEBUG Log ini dikompilasi, tetapi dihilangkan pada 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 memberikan informasi pelacakan
FINER Menunjukkan pesan pelacakan yang cukup mendetail
FINEST Menunjukkan pesan pelacakan yang sangat mendetail
INFO Tingkat pesan untuk pesan informatif
SEVERE Tingkat pesan yang menunjukkan kegagalan serius
WARNING Tingkat pesan yang menunjukkan potensi masalah

Gambar 4: java.util.Logging.Level.

0 Keadaan Darurat Sistem tidak dapat digunakan
1 Pemberitahuan Tindakan harus segera dilakukan
2 Kritis Kondisi kritis
3 Error Kondisi error
4 Peringatan Kondisi peringatan
5 Pemberitahuan Kondisi normal tetapi signifikan
6 Informasi Pesan informatif
7 Debug Pesan tingkat debug

Gambar 5: RFC 5424 - Bagian 6.2.1.

Logging aplikasi

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

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

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

adb shell setprop log.tag.FOO_TAG VERBOSE

Properti log.tag.* direset saat dimulai ulang. Ada juga varian persisten yang tetap ada di seluruh proses mulai ulang. Lihat di bawah:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Pemeriksaan Log#isLoggable meninggalkan trace log dalam kode aplikasi. Flag DEBUG boolean mengabaikan rekaman aktivitas log menggunakan pengoptimalan compiler 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 kumpulan aturan ProGuard oleh R8 pada waktu kompilasi. Contoh berikut menghapus semua logging di bawah 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

Hal ini berguna untuk menangani beberapa jenis build aplikasi (misalnya, build pengembangan vs. build rilis) dengan kode yang mendasarinya diharapkan sama, tetapi level log yang diizinkan berbeda. Kebijakan eksplisit harus ditetapkan dan diikuti untuk aplikasi (terutama aplikasi sistem) guna menentukan pengaruh jenis build dan ekspektasi rilis terhadap output log.

Logging sistem di Android Runtime (ART)

Ada beberapa class yang tersedia untuk aplikasi dan layanan sistem:

Class Tujuan
android.telephony.Rlog Logging radio
android.util.Log Logging aplikasi umum
android.util.EventLog Logging peristiwa diagnostik integrator sistem
android.util.Slog Logging framework platform

Gambar 6: Tujuan dan class log sistem yang tersedia.

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

Logging native

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

liblog menyediakan wrapper untuk grup sub-blog menggunakan bentuk makro berikut:

[Sublog Buffer ID] LOG [Log Level ID]

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

Class wrapper Contoh fungsi
log_main.h ALOGV, ALOGW
log_radio.h RLOGD, RLOGE
log_system.h SLOGI, SLOGW

Gambar 7: Wrapper liblog.

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

Koleksi Penggunaan
async_safe Library hanya untuk logging dari lingkungan yang aman untuk sinyal asinkron
libbase Library logging yang menyediakan antarmuka aliran C++ ke logging, mirip dengan logging gaya Google (glog). libbase dapat digunakan dalam project eksternal dan tersedia di aplikasi yang menggunakan libbase_ndk.

Gambar 8: Library log tingkat lebih tinggi.

Perkiraan multi-stack

Karena perbedaan perincian dan intent level, tidak ada pencocokan yang jelas atau tepat dari berbagai standar logging. Misalnya, level java.util.logging.Level dan android.util.Log untuk log error tidak cocok 1:1:

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

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

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

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

Keamanan dan privasi

Jangan mencatat Informasi Identitas Pribadi (PII). Hal ini mencakup detail seperti:

  • Alamat email
  • Nomor telepon
  • Nama

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

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

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

Log perangkat

Akses ke semua log perangkat, termasuk penggunaan android.permission.READ_LOGS dibatasi:

  • Jika aplikasi di latar belakang meminta akses ke semua log perangkat, permintaan tersebut akan otomatis ditolak kecuali jika aplikasi:
    • Membagikan UID sistem.
    • Menggunakan proses sistem native (UID < APP_UID).
    • Menggunakan DropBoxManager.
    • Hanya mengakses buffer log peristiwa.
    • Menggunakan EventLog API.
    • Menggunakan pengujian berinstrumen.
  • Jika aplikasi di latar depan dengan READ_LOGS meminta akses ke log perangkat, sistem akan meminta pengguna untuk menyetujui atau menolak permintaan akses tersebut.