Artikel ini membahas proses pencatatan log, termasuk standar log, panduan tingkat, kelas, tujuan, dan perkiraan multi-stack.
Standar log
Logging di Android rumit karena campuran standar yang digunakan dan digabungkan dalam logcat
. Standar utama yang digunakan dijelaskan di bawah:
Sumber | Contoh | Panduan tingkat stack |
---|---|---|
RFC 5424 (standar syslog ) |
Kernel Linux, banyak aplikasi Unix | Kernel, daemon sistem |
android.util.Log |
Logging aplikasi + framework Android | 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, standar ini bervariasi dalam perincian. Persamaan perkiraan di seluruh standar adalah sebagai berikut:
Tingkat RFC 5424 | Tingkat 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: Tingkat logging syslog
, Android, dan Java.
Panduan tingkat log
Ada pedoman yang sudah diberikan untuk setiap standar log. Tingkat log yang dipilih mengikuti standar yang sesuai yang digunakan, seperti menggunakan standar syslog
untuk pengembangan kernel.
Urutan level log, dari 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 penelusuran yang cukup mendetail |
FINEST |
Menunjukkan pesan rekaman aktivitas yang sangat mendetail |
INFO |
Tingkat pesan untuk pesan informasi |
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 informasi |
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:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
Properti log.tag.*
direset saat perangkat di-reboot. Ada juga varian persisten yang tetap ada di seluruh proses reboot. Lihat di bawah:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Pemeriksaan Log#isLoggable
meninggalkan log aktivitas dalam kode aplikasi. Flag Boolean
DEBUG
melewati rekaman aktivitas log menggunakan pengoptimalan compiler yang ditetapkan ke
false
, seperti yang ditunjukkan di bawah:
private final static boolean DEBUG = false; |
---|
Logging dapat dihapus berdasarkan per-APK melalui kumpulan aturan ProGuard oleh R8
pada waktu kompilasi. Contoh berikut menghapus semua logging di bawah tingkat 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) yang kode dasarnya diharapkan sama, tetapi level log yang diizinkan berbeda. Kebijakan eksplisit harus ditetapkan dan diikuti agar aplikasi (terutama aplikasi sistem) dapat memutuskan 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 buffer printk
, dan syslog
(3)
yang sesuai dengan logger sistem umum. Android menggunakan library liblog
untuk logging sistem umum.
liblog
menyediakan wrapper untuk grup sublog menggunakan bentuk makro
berikut:
[Sublog Buffer ID] LOG [Log Level ID] |
RLOGD
, misalnya, 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: Pembungkus liblog
.
Android memiliki antarmuka tingkat yang lebih tinggi untuk mencatat log yang lebih disukai daripada penggunaan liblog
langsung, seperti yang terlihat di bawah:
Koleksi | Penggunaan |
---|---|
async_safe |
Library hanya untuk mencatat log dari lingkungan yang aman untuk sinyal asinkron |
libbase |
Library logging yang menyediakan antarmuka streaming C++ untuk logging, mirip dengan logging gaya Google (glog). libbase dapat digunakan di project eksternal
dan tersedia di aplikasi yang menggunakan libbase_ndk . |
Gambar 8: Library log tingkat yang lebih tinggi.
Perkiraan multi-stack
Karena perbedaan perincian dan maksud tingkat, tidak ada pencocokan yang jelas atau tepat dari berbagai standar logging. Misalnya, tingkat
java.util.logging.Level
dan android.util.Log
untuk log error tidak cocok 1:1:
java.util.Logging.Level | android.util.Log |
---|---|
PARAH | Log.wtf |
PARAH | Log.e |
Gambar 9: Tingkat error dalam logging Java standar vs. logging Android.
Dalam kasus seperti ini, gunakan standar individual untuk menentukan level yang akan diterapkan.
Selama pengembangan sistem dengan beberapa komponen tingkat stack, ikuti Gambar 1 untuk menentukan standar mana 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 merupakan informasi identitas 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.