Artikel ini membahas proses logging, termasuk standar log, pedoman level, kelas, tujuan, dan perkiraan multistack.
Standar Log
Logging di Android rumit karena campuran standar yang digunakan 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 | Pencatatan umum di Jawa | aplikasi non-sistem |
Gambar 1: Standar tingkat log.
Meskipun masing-masing standar ini memiliki tingkat konstruksi yang serupa, namun rinciannya berbeda-beda. Perkiraan persamaan 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 | Normal tapi signifikan | Log.w | WARNING |
6 | Informasi | Pesan informasi | Log.i | INFO |
7 | Men-debug | Pesan tingkat debug | Log.d | CONFIG , FINE |
- | - | Pesan yang bertele-tele | Log.v | FINER / FINEST |
Gambar 2: tingkat logging syslog
, Android, dan Java.
Pedoman Tingkat Log
Terdapat 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 tingkat log, dari yang paling kecil hingga yang paling banyak, ditunjukkan pada 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 dihapus 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 menyediakan informasi penelusuran |
FINER | Menunjukkan pesan penelusuran yang cukup detail |
FINEST | Menunjukkan pesan penelusuran yang sangat detail |
INFO | Tingkat pesan untuk pesan informasional |
SEVERE | Tingkat pesan menunjukkan kegagalan serius |
WARNING | Tingkat pesan 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 namun signifikan |
6 | Informasional | Pesan informasi |
7 | Men-debug | Pesan tingkat debug |
Gambar 5: RFC 5424
- Bagian 6.2.1 .
Pencatatan Aplikasi
Pencatatan log 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 |
---|
properti log.tag.*
disetel ulang saat reboot. Ada varian tetap yang tetap ada saat reboot juga. Lihat di bawah:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Pemeriksaan Log#isLoggable
meninggalkan jejak log dalam kode aplikasi. Tanda DEBUG
Boolean mengabaikan 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 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 tipe build aplikasi (misalnya, build pengembangan vs. build rilis) yang kode dasarnya diharapkan sama, namun tingkat log yang diizinkan berbeda. Kebijakan eksplisit harus ditetapkan dan diikuti untuk aplikasi (khususnya aplikasi sistem) untuk memutuskan bagaimana tipe build dan ekspektasi rilis memengaruhi keluaran log.
Pencatatan Sistem 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 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 ke C/C++ mengikuti standar syslog
dengan syslog
(2) yang berhubungan dengan syslog
kernel Linux yang mengontrol buffer printk
, dan syslog
(3) yang berhubungan dengan logger sistem umum. Android menggunakan perpustakaan liblog
untuk pencatatan sistem umum.
liblog
menyediakan wrapper untuk grup sublog menggunakan formulir makro berikut:
[Sublog Buffer ID] LOG [Log Level ID] |
RLOGD
, misalnya, berhubungan 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 tinggi untuk logging yang lebih disukai daripada penggunaan liblog
langsung, seperti terlihat di bawah:
Perpustakaan | Penggunaan |
---|---|
async_safe | Perpustakaan hanya untuk masuk dari lingkungan yang aman sinyal asinkron |
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: Perpustakaan log tingkat yang lebih tinggi.
Perkiraan Multistack
Karena perbedaan dalam perincian dan tingkat maksud, tidak ada pencocokan yang jelas atau tepat untuk berbagai standar logging. Misalnya, level java.util.logging.Level
dan android.util.Log
untuk log kesalahan tidak cocok dengan perbandingan 1:1:
java.util.Logging.Level | android.util.Log |
---|---|
BERAT | Log.wtf |
BERAT | Log.e |
Gambar 9: Tingkat kesalahan 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 tingkat tumpukan, ikuti Gambar 1 untuk menentukan standar mana yang akan digunakan per komponen. Untuk panduan perkiraan mengenai pesan tingkat, ikuti Gambar 2.
Keamanan dan Privasi
Jangan mencatat Informasi Identifikasi Pribadi (PII). Ini termasuk rincian seperti:
- Alamat email
- Nomor telepon
- Nama
Demikian pula, detail tertentu dianggap sensitif meskipun tidak secara eksplisit dapat diidentifikasi secara pribadi.
Misalnya, meskipun informasi zona waktu tidak dianggap dapat diidentifikasi secara pribadi, informasi tersebut memberikan indikasi perkiraan lokasi pengguna.
Kebijakan log dan detail yang dapat diterima harus ditangani sebagai bagian dari tinjauan keamanan dan privasi sebelum dirilis.
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 secara otomatis ditolak kecuali aplikasi:
- berbagi UID sistem.
- menggunakan proses sistem asli (
UID
<APP_UID
). - menggunakan
DropBoxManager
. - hanya mengakses buffer log peristiwa.
- menggunakan API
EventLog
. - menggunakan tes berinstrumen.
- Jika aplikasi di latar depan dengan
READ_LOGS
meminta akses ke log perangkat, sistem akan meminta pengguna untuk menyetujui atau menolak permintaan akses.