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