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