Günlük kaydını anlama

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 mesajlaşması 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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

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.