Günlüğe kaydetmeyi anlama

Bu makalede, günlük standartları, düzey yönergeleri, sınıflar, amaçlar ve çoklu yığın yaklaşımları da dahil olmak üzere günlük kaydı süreci ele alınmaktadır.

Günlük standartları

Android'de kullanılan standartların logcat içinde birleştirilmesi nedeniyle günlük kaydı karmaşıktır. Kullanılan başlıca standartlar aşağıda ayrıntılı olarak açıklanmıştır:

Kaynak Örnekler Yığın düzeyi yönergeleri
RFC 5424 (syslog standart) Linux çekirdeği, birçok Unix uygulaması Çekirdek, sistem arka plan programları
android.util.Log Android çerçevesi + uygulama günlüğü kaydı Android çerçevesi ve sistem uygulaması
java.util.logging.Level Java'da genel günlük kaydı sistem dışı uygulama

Şekil 1: Günlük düzeyi standartları.

Bu standartların her birinin benzer bir seviye yapısı olsa da ayrıntı düzeyleri farklıdır. Standartlar arasındaki yaklaşık eşdeğerler şunlardır:

RFC 5424 Düzeyi RFC 5424 Önem Düzeyi RFC 5424 Açıklaması android.util.Log java.util.logging.Level
0 Acil durum Sistem kullanılamıyor Log.e / Log.wtf SEVERE
1 Uyarı Hemen işlem yapılmalıdır Log.e / Log.wtf SEVERE
2 Kritik (Critical) Kritik koşullar Log.e / Log.wtf SEVERE
3 Hata Hata koşulları Log.e SEVERE
4 Uyarı Uyarı koşulları Log.w WARNING
5 Bildirim Normal ancak önemli Log.w WARNING
6 Bilgi Bilgilendirme mesajları Log.i INFO
7 Hata ayıkla Hata ayıklama düzeyindeki mesajlar Log.d CONFIG, FINE
- - Ayrıntılı mesajlaşma Log.v FINER/FINEST

Şekil 2: syslog, Android ve Java günlük kaydı düzeyleri.

Günlük seviyesi yönergeleri

Her günlük standardı için mevcut yönergeler vardır. Seçilen günlük düzeyi, çekirdek geliştirme için syslog standardının kullanılması gibi, kullanılan uygun standarda uygundur.

En azdan en çoğa doğru günlük düzeyi sıralamaları aşağıdaki üç şekilde gösterilmektedir:

ERROR Bu günlükler her zaman saklanır.
WARN Bu günlükler her zaman saklanır.
INFO Bu günlükler her zaman saklanır.
DEBUG Bu günlükler derlenir ancak çalışma zamanında kaldırılır.
VERBOSE Bu günlükler, geliştirme süreci dışında hiçbir zaman bir uygulamada derlenmez.

Şekil 3: android.util.Log

CONFIG Statik yapılandırma mesajları için mesaj düzeyi
FINE İzleme bilgilerini sağlayan mesaj düzeyi
FINER Oldukça ayrıntılı bir izleme mesajını gösterir.
FINEST Çok ayrıntılı bir izleme mesajını gösterir.
INFO Bilgilendirici mesajlar için mesaj düzeyi
SEVERE Ciddi bir hatayı gösteren ileti düzeyi
WARNING Olası bir sorunu gösteren mesaj düzeyi

Şekil 4: java.util.Logging.Level.

0 Acil durum Sistem kullanılamıyor
1 Uyarı Hemen işlem yapılmalıdır
2 Kritik (Critical) Kritik koşullar
3 Hata Hata koşulları
4 Uyarı Uyarı koşulları
5 Bildirim Normal ancak önemli durum
6 Bilgilendirici Bilgilendirme amaçlı mesajlar
7 Hata ayıkla Hata ayıklama düzeyindeki mesajlar

Şekil 5: RFC 5424 - Bölüm 6.2.1.

Uygulama günlük kaydı

Seçici günlük kaydı, aşağıda gösterildiği gibi Log#isLoggable kullanılarak TAG sınıfı tarafından android.util.Log ile gerçekleştirilir:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

Günlükler, aşağıda gösterildiği gibi belirli bir günlük kaydı düzeyini sağlamak için çalışma zamanında ayarlanabilir:

adb shell setprop log.tag.FOO_TAG VERBOSE

Yeniden başlatma işleminde log.tag.* özellikleri sıfırlanır. Yeniden başlatma işlemlerinde de kalıcı olan varyantlar vardır. Aşağıya bakın:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Log#isLoggable kontrolleri, uygulama kodunda günlük izleri bırakır. Boolean DEBUG, aşağıdaki örnekte gösterildiği gibi derleyici optimizasyonları kullanılarak günlük izlemelerinin atlanmasını sağlar: false

private final static boolean DEBUG = false;

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

Günlük kaydı, derleme sırasında R8 tarafından ProGuard kural kümeleri aracılığıyla APK bazında kaldırılabilir. Aşağıdaki örnekte, android.util.Log için INFO düzeyinin altındaki tüm günlük kaydı kaldırılır:

# 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

Bu, temel kodun aynı olması ancak izin verilen günlük düzeylerinin farklı olması beklenen birden fazla uygulama derleme türünü (ör. geliştirme derlemeleri ve yayın derlemeleri) işlemek için kullanışlıdır. Derleme türlerinin ve yayın beklentilerinin günlük çıktısını nasıl etkileyeceğine karar vermek için uygulamalarda (özellikle sistem uygulamalarında) açık bir politika belirlenmeli ve bu politikaya uyulmalıdır.

Android Çalışma Zamanı'nda (ART) sistem günlüğü

Sistem uygulamaları ve hizmetleri için kullanılabilecek çeşitli sınıflar vardır:

Sınıf Amaç
android.telephony.Rlog Radyo günlük kaydı
android.util.Log Genel uygulama günlük kaydı
android.util.EventLog Sistem entegratörü teşhis etkinliklerinin günlüğe kaydedilmesi
android.util.Slog Platform çerçevesi günlük kaydı

Şekil 6: Kullanılabilir sistem günlüğü sınıfları ve amaçları.

android.util.Log ve android.util.Slog aynı günlük seviyesi standartlarını kullansa da Slog, yalnızca platform tarafından kullanılabilen bir @hide sınıfıdır. EventLog düzeyleri, /system/etc/event-log-tags içindeki event.logtags dosyasındaki girişlerle eşlenir.

Yerel günlük kaydı

C/C++'da günlük kaydı, syslog standardına uygundur. syslog(2), printk arabelleğini kontrol eden Linux çekirdeğine syslog, syslog(3) ise genel sistem günlükçüsüne karşılık gelir. Android, genel sistem günlük kaydı için liblog kitaplığını kullanır.

liblog, aşağıdaki makro biçimini kullanarak alt günlük grupları için sarmalayıcılar sağlar:

[Sublog Buffer ID] LOG [Log Level ID]

Örneğin, RLOGD, [Radio log buffer ID] LOG [Debug Level] ile eşleşir. Başlıca liblog sarmalayıcıları şunlardır:

Sarmalayıcı sınıfı Örnek işlevler
log_main.h ALOGV, ALOGW
log_radio.h RLOGD, RLOGE
log_system.h SLOGI, SLOGW

Şekil 7: liblog sarmalayıcıları.

Android'de, aşağıda gösterildiği gibi doğrudan liblog kullanımına kıyasla tercih edilen daha üst düzey günlük kaydı arayüzleri bulunur:

Kitaplık Kullanım
async_safe Yalnızca async-signal-safe ortamlardan günlük kaydı için kullanılan kitaplık
libbase Google tarzı (glog) günlüğe kaydetmeye benzer şekilde, günlüğe kaydetme için C++ akış arayüzü sağlayan günlük kaydetme kitaplığı. libbase, hem harici projelerde kullanılabilir hem de libbase_ndk kullanan uygulamalarda kullanılabilir.

Şekil 8: Daha üst düzey günlük kitaplıkları.

Çoklu yığın yaklaşımları

Ayrıntı düzeyi ve seviye amacındaki farklılıklar nedeniyle, farklı günlük kaydı standartlarının net veya tam eşleşmeleri yoktur. Örneğin, hata günlükleri için java.util.logging.Level ve android.util.Log düzeyleri bire bir eşleşmez:

java.util.Logging.Level android.util.Log
ŞİDDETLİ Log.wtf
ŞİDDETLİ Log.e

Şekil 9: Standart Java günlük kaydı ile Android günlük kaydındaki hata seviyesi.

Bu gibi durumlarda, hangi seviyenin uygulanacağını belirlemek için ilgili standardı kullanın.

Birden fazla yığın düzeyinde bileşeni olan bir sistem geliştirirken bileşen başına hangi standardın kullanılacağını belirlemek için Şekil 1'i inceleyin. Katman mesajlaşmasıyla ilgili yaklaşık bir kılavuz için Şekil 2'yi inceleyin.

Güvenlik ve gizlilik

Kimliği tanımlayabilecek bilgiler (PII) günlüğe kaydedilmemelidir. Aşağıdakiler gibi ayrıntılar bu kapsamdadır:

  • E-posta adresleri
  • Telefon numaraları
  • İsimler

Benzer şekilde, açıkça kimliği tanımlayabilecek bilgiler olmasa bile belirli ayrıntılar hassas olarak kabul edilir.

Örneğin, saat dilimi bilgisi kimliği tanımlayabilecek bilgi olarak kabul edilmese de kullanıcının yaklaşık konumu hakkında fikir verir.

Günlük politikası ve kabul edilebilir ayrıntılar, yayınlanmadan önce güvenlik ve gizlilik incelemesi kapsamında ele alınmalıdır.

Cihaz günlükleri

android.permission.READ_LOGS kullanımı da dahil olmak üzere tüm cihaz günlüklerine erişim kısıtlanmıştır:

  • Arka plandaki bir uygulama tüm cihaz günlüklerine erişim isteğinde bulunursa uygulama aşağıdakilerden birini yapmadığı sürece istek otomatik olarak reddedilir:
    • Sistem UID'sini paylaşır.
    • Yerel bir sistem süreci (UID < APP_UID) kullanır.
    • DropBoxManager kullanılır.
    • Yalnızca etkinlik günlüğü arabelleğine erişir.
    • EventLog API'yi kullanır.
    • Araçlı testler kullanır.
  • Ön planda çalışan bir uygulama READ_LOGS ile cihaz günlüklerine erişim isteğinde bulunursa sistem, kullanıcıdan erişim isteğini onaylamasını veya reddetmesini ister.