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