Günlüğü Anlamak

Bu makale, günlük standartları, düzey yönergeleri, sınıflar, amaçlar ve çok yığınlı yaklaşımlar dahil olmak üzere günlüğe kaydetme sürecini kapsar.

Günlük Standartları

Android'de oturum açmak, kullanılan ve logcat içinde birleştirilen standartların karışımı nedeniyle karmaşıktır. Kullanılan ana standartlar aşağıda detaylandırılmıştır:

Kaynak Örnekler Yığın düzeyinde rehberlik
RFC 5424 ( syslog standardı) Linux çekirdeği, birçok Unix uygulaması Çekirdek, sistem cinleri
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 bir yapıya sahip olsa da, taneciklik bakımından farklılık gösterirler. Standartlar arasındaki yaklaşık eşdeğerler aşağıdaki gibidir:

RFC 5424 Seviyesi RFC 5424 Önem Derecesi RFC 5424 Açıklama android.util.Log java.util.logging.Level
0 Acil Durum Sistem kullanılamaz Log.e / Log.wtf SEVERE
1 Uyarı Bir an önce ö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 önemli Log.w WARNING
6 Bilgi bilgi mesajlaşma Log.i INFO
7 hata ayıklama Hata ayıklama düzeyinde mesajlar Log.d CONFIG , FINE
- - Ayrıntılı mesajlaşma Log.v FINER / FINEST

Şekil 2: syslog , Android ve Java günlük kaydı seviyeleri.

Günlük Düzeyi Yönergeleri

Her günlük standardı için verilen mevcut yönergeler vardır. Seçilen günlük düzeyi, çekirdek geliştirme için syslog standardını kullanmak gibi, kullanılan uygun standardı takip eder.

Günlük düzeyi siparişleri, 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 dışında hiçbir zaman bir uygulamada derlenmez.

Şekil 3: android.util.Log

CONFIG Statik yapılandırma mesajları için mesaj seviyesi
FINE İzleme bilgisi sağlayan mesaj seviyesi
FINER Oldukça ayrıntılı bir izleme mesajını gösterir
FINEST Son derece ayrıntılı bir izleme mesajını gösterir
INFO Bilgilendirici mesajlar için mesaj seviyesi
SEVERE Ciddi bir arızayı gösteren mesaj seviyesi
WARNING Olası bir sorunu belirten mesaj düzeyi

Şekil 4: java.util.Logging.Level .

0 Acil Durum Sistem kullanılamaz
1 Uyarı Bir an önce ö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 bilgi mesajları
7 hata ayıklama Hata ayıklama düzeyinde mesajlar

Ş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 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.* özellikleri yeniden başlatıldığında sıfırlanır. Yeniden başlatmalarda da kalan kalıcı değişkenler vardır. 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 kümeleri aracılığıyla APK bazında kaldırılabilir. Aşağıdaki örnek, android.util.Log için INFO düzeyinde 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 alınan kodun aynı olması beklenen, ancak izin verilen günlük düzeylerinin farklı olduğu birden çok uygulama derleme türünü (örneğin, geliştirme derlemeleri ve yayın derlemeleri) işlemek için kullanışlıdır. Yapı türlerinin ve yayın beklentilerinin günlük çıktısını nasıl etkilediğine karar vermek için uygulamalar (özellikle sistem uygulamaları) için açık bir ilke belirlenmeli ve izlenmelidir.

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 kaydı
android.util.Log Genel uygulama günlüğü
android.util.EventLog Sistem entegratörü tanı olay günlüğü
android.util.Slog Platform çerçevesi günlüğü

Ş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üzeyi standartlarını kullanmasına rağmen, 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ındaki girişlerle eşleştirilir.

Yerel Günlük Kaydı

C/C++'da oturum açma, printk arabelleğini kontrol eden Linux çekirdek syslog günlüğüne karşılık gelen syslog (2) ve genel sistem günlükçüsüne karşılık gelen syslog (3) ile syslog standardını izler. Android, genel sistem günlüğü 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]

RLOGD , örneğin, [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 fonksiyonlar
log_main.h ALOGV , ALOGW
log_radio.h RLOGD , RLOGE
log_system.h SLOGI , SLOGW

Şekil 7: liblog sarmalayıcıları.

Android, aşağıda görüldüğü gibi, doğrudan liblog kullanımına tercih edilen, günlük kaydı için daha yüksek seviyeli arayüzlere sahiptir:

Kütüphane kullanım
async_safe Yalnızca zaman uyumsuz sinyal açısından güvenli ortamlardan oturum açmak için kitaplık
libbase Google tarzı (glog) günlüğe kaydetmeye benzer şekilde, günlüğe kaydetme için bir C++ akış arabirimi sağlayan günlük kaydı kitaplığı. libbase hem harici projelerde hem de libbase_ndk kullanan uygulamalarda kullanılabilir.

Şekil 8: Daha yüksek seviye günlük Kitaplıkları.

Çoklu Yığın Yaklaşımları

Ayrıntı düzeyi ve amaç düzeyindeki farklılıklar nedeniyle, farklı günlük kaydı standartlarının açık veya kesin eşleşmeleri yoktur. Örneğin, hata günlükleri için java.util.logging.Level ve android.util.Log seviyeleri 1:1 eşleşme değildir:

java.util.Logging.Level android.util.Log
ŞİDDETLİ Log.wtf
ŞİDDETLİ Log.e

Şekil 9: Standart Java günlüğüne karşı Android günlüğüne ilişkin 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şenle sistem geliştirme sırasında, bileşen başına hangi standardın kullanılacağını belirlemek için Şekil 1'i izleyin. Katmanlı mesajlaşmaya ilişkin yaklaşık bir kılavuz için Şekil 2'yi izleyin.

Güvenlik ve Gizlilik

Kişisel 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, belirli ayrıntılar, açıkça kişisel olarak tanımlanmasa bile hassas olarak kabul edilir.

Örneğin, saat dilimi bilgisi kişisel olarak tanımlanabilir olarak kabul edilmese de, bir kullanıcının yaklaşık konumunun bir göstergesini verir.

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.