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; |
---|
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.