Günlüğe kaydetmeyi anlama

Bu makalede günlük kaydı süreci (günlük standartları, düzey yönergeleri, sınıflar, amaçlar ve çok yığınlı yaklaşık değerler dahil) ele alınmaktadır.

Günlük standartları

Android'de giriş yapma işlemi, logcat'te birleştirilen standartların karışımı nedeniyle 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üzeyinde kılavuz
RFC 5424 (syslog standardı) Linux çekirdeği, birçok Unix uygulaması Çekirdek, sistem arka plan programları
android.util.Log Android çerçevesi + uygulama günlük 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 biri benzer düzeyde yapılandırılmış olsa da ayrıntı düzeyi farklıdır. Standartlar arasındaki yaklaşık eşdeğerlikler şunlardır:

RFC 5424 Seviyesi 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ılması gerekir 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 Bilgi 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 kaydı düzeyi yönergeleri

Her günlük standardı için mevcut yönergeler vardır. Seçilen günlük düzeyi, kullanılan uygun standardı (ör. çekirdek geliştirme için syslog standardı) takip eder.

Günlük düzeyi siparişleri, en azdan en fazlaya doğru 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ırasında hariç hiçbir zaman bir uygulamada derlenmez.

Şekil 3: android.util.Log

CONFIG Statik yapılandırma mesajları için mesaj düzeyi
FINE İzleme bilgileri 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ı belirten mesaj düzeyi
WARNING Olası bir sorunu belirten mesaj düzeyi

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

0 Acil durum Sistem kullanılamıyor
1 Uyarı Hemen işlem yapılması gerekir
2 Kritik (Critical) Kritik koşullar
3 Hata Hata koşulları
4 Uyarı Uyarı koşulları
5 Bildirim Normal ancak önemli bir 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çmeli günlük kaydı, aşağıda gösterildiği gibi Log#isLoggable kullanılarak TAG tarafından android.util.Log sınıfıyla 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üzeyi sağlamak için çalışma zamanında ayarlanabilir:

adb shell setprop log.tag.FOO_TAG VERBOSE

log.tag.* mülkleri yeniden başlatıldığında sıfırlanır. Yeniden başlatmalarda da 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 izlemeleri bırakır. Mantıksal DEBUG işaretleri, aşağıda gösterildiği gibi false olarak ayarlanmış derleyici optimizasyonlarını kullanarak günlük izlemelerini atlar:

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 başına kaldırılabilir. Aşağıdaki örnekte, android.util.Log için INFO düzeyindeki günlük kayıtlarının altındaki her şey kaldırılmaktadı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ü (ör. geliştirme derlemeleri ve sürüm derlemeleri) için kullanışlıdır. Derleme türlerinin ve sürüm beklentilerinin günlük çıkışını nasıl etkilediğine karar vermek için uygulamalar (özellikle sistem uygulamaları) için net bir politika belirlenip uygulanmalıdır.

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

Sistem uygulamaları ve hizmetleri için kullanılabilen birkaç sınıf vardır:

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

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

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

Yerel günlük kaydı

C/C++'ta günlük kaydı, syslog tamponunu kontrol eden Linux çekirdeği syslog'ye karşılık gelen syslog(2) ve genel sistem günlüğüne karşılık gelen syslog(3) ile syslog standardını izler.printk Android, genel sistem günlük kaydı için liblog kitaplığını kullanır.

liblog, aşağıdaki makro biçimini kullanarak alt blog 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] değerine karşılık gelir. 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, aşağıdaki gibi doğrudan kullanıma kıyasla tercih edilen günlük kaydı için daha üst düzey arayüzlere sahiptir:liblog

Kitaplık Kullanım
async_safe Yalnızca ayarsız sinyal güvenli ortamlardan günlük kaydı için kitaplık
libbase Google tarzı (glog) günlük kaydına benzer şekilde, günlük kaydı için C++ akış arayüzü sağlayan günlük kaydı kitaplığı. libbase hem harici projelerde hem de libbase_ndk kullanan uygulamalarda kullanılabilir.

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

Çok katmanlı yaklaşık değerler

Ayrıntı düzeyi ve düzey amacındaki farklılıklar nedeniyle, farklı günlük kaydı standartları arasında net veya tam eşleşme yoktur. Örneğin, hata günlüklerinin java.util.logging.Level ve android.util.Log düzeyleri 1:1 eşleşmez:

java.util.Logging.Level android.util.Log
SEVERE Log.wtf
SEVERE Log.e

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

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

Birden fazla yığın düzeyinde bileşen içeren sistem geliştirme sırasında, bileşen başına hangi standardın kullanılacağını belirlemek için Şekil 1'i uygulayın. Katmanlı mesajlaşmayla ilgili yaklaşık bir kılavuz için Şekil 2'ye bakın.

Güvenlik ve gizlilik

Kimliği tanımlayabilecek bilgileri (PII) günlüğe kaydetmeyin. Buna aşağıdakiler gibi ayrıntılar dahildir:

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

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

Örneğin, saat dilimi bilgileri kimliği tanımlayabilecek bilgiler arasında yer almasa da kullanıcının yaklaşık konumu hakkında bilgi 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ı dahil tüm cihaz günlüklerine erişim kısıtlanmıştır:

  • Arka planda çalışan bir uygulama tüm cihaz günlüklerine erişim isteğinde bulunursa uygulama aşağıdakileri yapmadığı sürece istek otomatik olarak reddedilir:
    • Sistem UID'sini paylaşır.
    • Yerel bir sistem işlemi kullanır (UID < APP_UID).
    • DropBoxManager kullanılır.
    • Yalnızca olay günlüğü arabelleğine erişir.
    • EventLog API'yi kullanır.
    • Araçla testleri kullanır.
  • Ön planda bulunan ve READ_LOGS iznine sahip bir uygulama cihaz günlüklerine erişim isteğinde bulunursa sistem kullanıcıdan erişim isteğini onaylamasını veya reddetmesini ister.