Memahami Pencatatan

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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

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.