Günlüğü Anlamak

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;

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

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.