Memahami logging

Artikel ini membahas proses pencatatan, termasuk standar log, panduan level, kelas, tujuan, dan perkiraan multistack.

Standar log

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

Sumber Contoh Panduan tingkat stack
RFC 5424 (standar syslog) Kernel Linux, berbagai aplikasi Unix {i>Kernel, <i} {i>daemon<i} 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 level log.

Meskipun masing-masing standar ini memiliki tingkat konstruksi yang serupa, namun sangat bervariasi perincian. Perkiraan ekuivalen di seluruh standar adalah sebagai berikut:

Level 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. Catatan yang dipilih level aplikasi mengikuti standar yang sesuai yang digunakan, seperti menggunakan syslog standar pengembangan {i>kernel<i}.

Urutan level log, dari yang terkecil hingga yang paling besar, 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 dihilangkan saat runtime.
VERBOSE Log ini tidak pernah dikompilasi ke dalam aplikasi kecuali selama pengembangan produk.

Gambar 3: android.util.Log

CONFIG Level pesan untuk pesan konfigurasi statis
FINE Level pesan yang menyediakan informasi pelacakan
FINER Menunjukkan pesan pelacakan yang cukup mendetail
FINEST Menunjukkan pesan pelacakan yang sangat mendetail
INFO Tingkat pesan untuk pesan informasi
SEVERE Tingkat pesan yang mengindikasikan 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 informasi
7 Debug Pesan tingkat debug

Gambar 5: RFC 5424 - Bagian 6.2.1.

Logging aplikasi

Logging selektif dilakukan dengan TAG dari class android.util.Log menggunakan Log#isLoggable, sebagaimana ditunjukkan di bawah ini:

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

Log dapat disesuaikan saat runtime untuk menyediakan level logging tertentu seperti yang ditunjukkan di bawah ini:

adb shell setprop log.tag.FOO_TAG VERBOSE

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

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Pemeriksaan Log#isLoggable meninggalkan rekaman aktivitas log dalam kode aplikasi. Boolean Tanda DEBUG 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 di waktu kompilasi. Contoh berikut menghapus semua yang berada di bawah level INFO pencatatan log 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 (untuk misalnya, build pengembangan vs. build rilis) dengan kode yang mendasarinya diharapkan sama, namun tingkat log yang diizinkan berbeda. Konten eksplisit kebijakan harus ditetapkan dan diikuti untuk aplikasi (terutama sistem aplikasi) untuk menentukan pengaruh jenis build dan ekspektasi rilis {i>output<i} tersebut.

Logging sistem di Android Runtime (ART)

Ada beberapa class yang tersedia untuk sistem aplikasi dan layanan:

Kelas 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: Class dan tujuan log sistem yang tersedia.

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

Logging native

Logging in C/C++ mengikuti standar syslog dengan syslog(2) yang sesuai dengan kernel Linux syslog yang mengontrol buffer printk, dan syslog(3) yang sesuai dengan {i> general system logger<i}. Android menggunakan liblog untuk logging sistem umum.

liblog menyediakan wrapper untuk grup sublog menggunakan makro berikut bentuk:

[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 level yang lebih tinggi untuk logging lebih disukai daripada Penggunaan liblog, seperti yang terlihat di bawah ini:

Koleksi Penggunaan
async_safe Library hanya untuk logging dari lingkungan async-signal-safe
libbase Library logging yang menyediakan antarmuka streaming C++ ke logging, mirip dengan Logging gaya Google (glog). libbase dapat digunakan di kedua project eksternal dan tersedia di aplikasi yang menggunakan libbase_ndk.

Gambar 8: Library log dengan level yang lebih tinggi.

Perkiraan multistack

Karena perbedaan dalam tingkat perincian dan maksud tingkat, tidak ada pencocokan persis dari standar pencatatan yang berbeda. Misalnya, Level java.util.logging.Level dan android.util.Log untuk log error bukan kecocokan 1:1:

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

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

Dalam kasus seperti ini, gunakan standar individual untuk menentukan tingkat mana yang terapkan.

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

Keamanan dan privasi

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

  • Alamat email
  • Nomor telepon
  • Nama

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

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

Kebijakan log dan detail yang dapat diterima harus ditangani sebagai bagian dari keamanan dan peninjauan 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 ditolak kecuali aplikasi:
    • Membagikan UID sistem.
    • Menggunakan proses sistem native (UID < APP_UID).
    • Menggunakan DropBoxManager.
    • Hanya mengakses buffer log peristiwa.
    • Menggunakan EventLog API.
    • Menggunakan uji instrumentasi.
  • Jika aplikasi di latar depan dengan READ_LOGS meminta akses ke log perangkat, sistem meminta pengguna untuk menyetujui atau menolak permintaan akses tersebut.