Bu makalede günlük standartları, seviye yönergeleri, amaçları ve çoklu yığın yaklaşımlarını gösterir.
Günlük standartları
Android'e giriş, kullanılan standartlar nedeniyle karmaşık bir işlemdir.
logcat
içinde birleştirilmiş. Kullanılan ana standartlar aşağıda açıklanmıştır:
Kaynak | Örnekler | Grup düzeyinde rehberlik |
---|---|---|
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ü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 birinin yapısı benzer seviyede olsa da ayrıntı düzeyini etkiler. Standartlara göre yaklaşık eşdeğerleri aşağıdaki gibidir:
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ı | İşlem hemen 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 | 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 düzeyinde yönergeler
Her günlük standardı için verilen yönergeler mevcuttur. Seçilen günlük
düzeyi, kullanılan uygun standarda uygun olmalıdır (ör. syslog
geliştirmeyi öğreneceksiniz.
Günlük düzeyinde siparişler, en azdan en çoka doğru aşağıdaki üç resimde 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 çıkarılır. |
VERBOSE |
Bu günlükler, bahsedeceğim. |
Ş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ı gösterir |
FINEST |
Son derece ayrıntılı bir izleme mesajı belirtir |
INFO |
Bilgilendirme amaçlı mesajların mesaj düzeyi |
SEVERE |
Ciddi bir hata olduğunu gösteren mesaj 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ı | İşlem hemen 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 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çimli günlük kaydı, TAG
ile android.util.Log
sınıfı tarafından Log#isLoggable
kullanılarak yapılır.
aşağıdaki gibidir:
if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) { Log.v("FOO_TAG", "Message for logging."); } |
---|
Günlükler, gösterildiği gibi belirli bir günlük kaydı düzeyi sağlamak için çalışma zamanında ayarlanabilir aşağıda bulabilirsiniz:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
Yeniden başlatma sırasında log.tag.*
özellikleri sıfırlanır. Her biri 100'den az gösterim alan
kalıcı 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ıyor. Boole
DEBUG
işaretleri, şu değere ayarlanmış derleyici optimizasyonlarını kullanarak günlük izlerini atlar:
false
, aşağıda gösterildiği gibi:
private final static boolean DEBUG = false; |
---|
Günlük kaydı, ProGuard kural grupları aracılığıyla APK'ya göre şu tarihte kaldırılabilir: R8
derleme zamanıdır. Aşağıdaki örnekte, INFO
seviyesinin altındaki her şey kaldırılır
android.util.Log
için günlük kaydı:
# 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, birden fazla uygulama derleme türünü (ör. geliştirme derlemeleri ile sürüm derlemeleri) karşılaştırabilirsiniz. aynı olması beklenir ancak izin verilen günlük düzeyleri farklı. Uygunsuz Uygulamalar (özellikle de sistem) için politika ayarlanmalı ve uygulanmalıdır. uygulamalar) inceleyin. çıktı.
Android Runtime'da (ART) sistem günlük kaydı
Sistem için kullanılabilen birkaç sınıf vardır. uygulamalar ve hizmetler:
Sınıf | Amaç |
---|---|
android.telephony.Rlog |
Telsiz kaydı |
android.util.Log |
Genel uygulama günlük kaydı |
android.util.EventLog |
Sistem entegratörü teşhis etkinliği günlük kaydı |
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 düzeyini kullanıyor
standartlarından biri olarak, Slog
yalnızca platform tarafından kullanılabilen bir @hide
sınıfıdır. EventLog
düzeyler, event.logtags
içindeki girişlerle eşlenir.
/system/etc/event-log-tags
klasöründeki dosyalardan birini seçin.
Yerel günlük kaydı
C/C++ hizmetine giriş yaparken syslog
(2) standardına karşılık gelen syslog
printk
arabelleğini kontrol eden syslog
Linux çekirdeği ve syslog
(3)
ekleyebilirsiniz. Android, liblog
kullanır
kitaplığını kullanabilirsiniz.
liblog
, aşağıdaki makroyu kullanarak alt günlük grupları için sarmalayıcılar sağlar
form:
[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'in günlük kaydı için doğrudan yerine tercih edilen daha üst düzey arayüzleri vardır.
Aşağıda gösterildiği gibi liblog
kullanımı:
Kitaplık | Kullanım |
---|---|
async_safe |
Yalnızca eşzamansız sinyal açısından güvenli ortamlardan günlük kaydı için kitaplık |
libbase |
Günlük kaydı için C++ akış arayüzü sağlayan günlük kaydı kitaplığı
Google tarzı (glog) günlük kaydı. libbase her iki harici projede de kullanılabilir
ve libbase_ndk kullanan uygulamalarda kullanılabilir. |
Şekil 8: Üst düzey günlük Kitaplıkları.
Çoklu yığın tahminleri
Ayrıntı düzeyi ve düzey amacındaki farklılıklar nedeniyle,
tam olarak eşleşmelerini sağlayabilir. Örneğin,
Hata günlükleri için java.util.logging.Level
ve android.util.Log
düzeyleri bir
1:1 eşleşme:
Java.util.Logging.Level | android.util.Log |
---|---|
SESLİ | Log.wtf |
SESLİ | Log.e |
Şekil 9: Standart Java günlük kaydı ile Android arasındaki hata düzeyi günlük kaydı.
Bu gibi durumlarda, hangi düzeyin yüksek olması gerektiğini belirlemek için
geçerlidir.
Birden fazla yığın düzeyinde bileşenle sistem geliştirme sırasında Bileşen başına hangi standardın kullanılacağını belirlemek için Şekil 1'e bakın. Yaklaşık için Şekil 2'ye bakın.
Güvenlik ve gizlilik
Kimliği tanımlayabilecek bilgileri (PII) günlüğe kaydetmeyin. Bu aşağıdaki gibi ayrıntıları içerir:
- E-posta adresleri
- Telefon numaraları
- İsimler
Benzer şekilde, bazı bilgiler hassas olarak kabul edilir ancak kimliği tanımlayabilecek bilgilerdir.
Örneğin, saat dilimi bilgileri kimliği tanımlayabilecek bilgiler olarak 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, güvenliğin ve gizlilik incelemesinden geçmesi gerekir.
Cihaz günlükleri
Aşağıdakiler dahil tüm cihaz günlüklerine erişim:
android.permission.READ_LOGS
kısıtlandı:
- Arka plandaki bir uygulama tüm cihaz günlüklerine erişim izni isterse istek otomatik olarak uygulama şu durumlar söz konusu değilse reddedilmiştir:
- Sistem UID'sini paylaşır.
- Yerel 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çlı testleri kullanır.
- Ön plandaki
READ_LOGS
özelliğine sahip bir uygulama cihaz günlüklerine erişim isterse sistem, kullanıcıdan erişim isteğini onaylamasını veya reddetmesini ister.