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