Bu makale, günlük standartları, düzey yönergeleri, sınıflar, amaçlar ve çoklu yığın yaklaşımları dahil olmak üzere günlüğe kaydetme sürecini kapsar.
Günlük Standartları
logcat
birleştirilen standartların karışımı nedeniyle Android'de oturum açmak karmaşıktır. Kullanılan ana standartlar aşağıda ayrıntılı olarak açıklanmıştır:
Kaynak | Örnekler | Yığın düzeyinde rehberlik |
---|---|---|
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üğü | Android çerçevesi ve sistem uygulaması |
java.util.logging.Level | Java'da genel oturum açma | sistem dışı uygulama |
Şekil 1: Günlük düzeyi standartları.
Bu standartların her biri benzer düzeyde yapıya sahip olsa da, ayrıntı düzeyi farklılık gösterir. Standartlar genelindeki yaklaşık eşdeğerler aşağıdaki gibidir:
RFC 5424 Düzeyi | RFC 5424 Önem Derecesi | RFC 5424 Açıklaması | android.util.Log | java.util.logging.Level |
---|---|---|---|---|
0 | Acil durum | Sistem kullanılamaz | Log.e / Log.wtf | SEVERE |
1 | Uyarı | Derhal önlem alınmalı | Log.e / Log.wtf | SEVERE |
2 | Kritik | 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 | Fark etme | Normal ama anlamlı | Log.w | WARNING |
6 | Bilgi | Bilgi mesajları | Log.i | INFO |
7 | Hata ayıklama | Hata ayıklama düzeyindeki iletiler | 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 Düzeyi Yönergeleri
Her log standardı için verilen 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 standardı takip eder.
Günlük düzeyindeki siparişler, en azdan en çoka, aşağıdaki üç şekilde gösterilmektedir:
ERROR | Bu günlükler her zaman tutulur. |
WARN | Bu günlükler her zaman tutulur. |
INFO | Bu günlükler her zaman tutulur. |
DEBUG | Bu günlükler derlenir ancak çalışma zamanında çıkarılır. |
VERBOSE | Bu günlükler, geliştirme aşaması 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 bilgisi sağlayan mesaj düzeyi |
FINER | Oldukça ayrıntılı bir izleme mesajını gösterir |
FINEST | Son derece ayrıntılı bir izleme mesajını belirtir |
INFO | Bilgilendirici mesajlar için mesaj düzeyi |
SEVERE | Ciddi bir arızayı belirten mesaj düzeyi |
WARNING | Potansiyel bir sorunu belirten mesaj düzeyi |
Şekil 4: java.util.Logging.Level
.
0 | Acil durum | Sistem kullanılamaz |
1 | Uyarı | Derhal önlem alınmalı |
2 | Kritik | Kritik koşullar |
3 | Hata | Hata koşulları |
4 | Uyarı | Uyarı koşulları |
5 | Fark etme | Normal ama önemli durum |
6 | Bilgilendirici | Bilgilendirici mesajlar |
7 | Hata ayıklama | Hata ayıklama düzeyindeki iletiler |
Şekil 5: RFC 5424
- Bölüm 6.2.1 .
Uygulama Günlüğü
Seçmeli günlük kaydı, aşağıda gösterildiği gibi Log#isLoggable
kullanılarak android.util.Log
sınıfı tarafından TAG
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 seçilen düzeyde bir günlük kaydı sağlamak üzere çalışma zamanında ayarlanabilir:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
log.tag.*
özellikleri yeniden başlatma sırasında sıfırlanır. Yeniden başlatmalarda da kalan kalıcı değişkenler var. Aşağıya bakınız:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Log#isLoggable
kontrolleri uygulama kodunda günlük izleri bırakır. Boolean DEBUG
bayrakları, aşağıda gösterildiği gibi false
olarak ayarlanmış derleyici optimizasyonlarını kullanarak günlük izlerini atlar:
private final static boolean DEBUG = false; |
---|
Günlük kaydı, derleme zamanında R8
tarafından ProGuard kural setleri aracılığıyla her APK için ayrı ayrı kaldırılabilir. Aşağıdaki örnek, android.util.Log
için INFO
düzeyindeki günlük kaydının altındaki her şeyi kaldırı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ının beklendiği ancak izin verilen günlük düzeylerinin farklı olduğu birden fazla uygulama derlemesi türünün (örneğin, geliştirme derlemeleri ve yayın derlemeleri) işlenmesi için kullanışlıdır. Derleme türlerinin ve sürüm beklentilerinin günlük çıktısını nasıl etkileyeceğine karar vermek için uygulamalar (özellikle sistem uygulamaları) için açık bir politika belirlenmeli ve takip edilmelidir.
Android Çalışma Zamanında Sistem Günlüğü (ART)
Sistem uygulamaları ve hizmetleri için kullanılabilen çeşitli sınıflar vardır:
Sınıf | Amaç |
---|---|
android.telephony.Rlog | Radyo kaydı |
android.util.Log | Genel uygulama günlüğü |
android.util.EventLog | Sistem entegratörü tanılama olay günlüğü kaydı |
android.util.Slog | Platform çerçevesi günlüğü |
Şekil 6: Mevcut 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 oturum açmak, printk
arabelleğini kontrol eden Linux çekirdeği sistem günlüğüne karşılık syslog
syslog
(2) ve genel sistem günlüğe karşılık gelen syslog
(3) ile syslog
standardını takip eder. Android, genel sistem günlüğü kaydı için liblog
kitaplığını kullanır.
liblog
aşağıdaki makro formunu 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]
ne karşılık gelir. Başlıca liblog
sarmalayıcıları aşağıdaki gibidir:
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ı.
Aşağıda görüldüğü gibi Android, günlük kaydı için doğrudan liblog
kullanımına göre tercih edilen daha yüksek düzeyli arayüzlere sahiptir:
Kütüphane | Kullanım |
---|---|
async_safe | Yalnızca eşzamansız sinyal açısından güvenli ortamlardan oturum açmak için kitaplık |
libbase | Google tarzı (glog) günlük kaydına benzer şekilde, günlük kaydına C++ akış arayüzü sağlayan günlük kaydı kitaplığı. libbase her iki harici projede de kullanılabilir ve libbase_ndk kullanan uygulamalarda mevcuttur. |
Şekil 8: Daha yüksek düzeydeki günlük Kitaplıkları.
Çoklu Yığın Yaklaşımları
Ayrıntı düzeyi ve düzey amacındaki farklılıklar nedeniyle, farklı günlük kaydı standartlarının net veya kesin eşleşmeleri yoktur. Örneğin, hata günlüklerine ilişkin java.util.logging.Level
ve android.util.Log
düzeyleri 1:1 eşleşme değildir:
java.util.Logging.Level | android.util.Log |
---|---|
HAŞİN | Log.wtf |
HAŞİN | Log.e |
Şekil 9: Standart Java günlük kaydı ile Android günlük kaydı arasındaki hata düzeyi.
Bu gibi durumlarda hangi düzeyin uygulanacağını belirlemek için bireysel standardı kullanın.
Birden çok 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 izleyin. Katman mesajlaşmaya ilişkin yaklaşık bir kılavuz için Şekil 2'yi izleyin.
Güvenlik ve Gizlilik
Kişisel Olarak Tanımlanabilir Bilgileri (PII) günlüğe kaydetmeyin. Bu, aşağıdaki gibi ayrıntıları içerir:
- E-mail adresleri
- Telefon numaraları
- İsimler
Benzer şekilde, açıkça kişisel olarak tanımlanabilecek olmasa bile bazı ayrıntılar hassas kabul edilir.
Örneğin, saat dilimi bilgisi kişisel olarak tanımlanabilir kabul edilmese de kullanıcının yaklaşık konumuna ilişkin bir gösterge sağlar.
Günlük politikası ve kabul edilebilir ayrıntılar, yayınlanmadan önce güvenlik ve gizlilik incelemesinin bir parçası olarak 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 planda bir uygulama tüm cihaz günlüklerine erişim talep ederse, uygulama aşağıdaki işlemleri yapmadığı sürece istek otomatik olarak reddedilir:
- sistem UID'sini paylaşır.
- yerel bir sistem işlemi kullanır (
UID
<APP_UID
). -
DropBoxManager
kullanır. - yalnızca olay günlüğü arabelleğine erişir.
-
EventLog
API'sini kullanır. - aletli testler kullanır.
-
READ_LOGS
ile ön plandaki bir uygulama cihaz günlüklerine erişim isterse sistem kullanıcıdan erişim isteğini onaylamasını veya reddetmesini ister.