Logcat komut satırı aracı

Logcat, Log sınıfıyla uygulamanızdan yazdığınız mesajlar da dahil olmak üzere sistem mesajlarının günlüğünü döken bir komut satırı aracıdır.

Bu sayfa komut satırı logcat aracıyla ilgilidir. Ancak günlük mesajlarını Android Studio'daki Logcat penceresinden de görüntüleyebilirsiniz. Android Studio'daki günlükleri görüntüleme ve filtreleme hakkında daha fazla bilgi edinmek için Logcat ile günlükleri görüntüleme ve yazma bölümüne göz atın.

Günlük kaydı sistemine genel bakış

Android günlük kaydı sistemi, logd adlı sistem işlemi tarafından sağlanan yapılandırılmış dairesel arabelleklerden oluşur. Kullanılabilir tampon grubu sabittir ve sistem tarafından tanımlanır. En alakalı tamponlar şunlardır:

  • main: Çoğu uygulama günlüğünü depolar.
  • system: Android OS kaynaklı iletileri depolar.
  • crash: Kilitlenme günlüklerini depolar. Her günlük girişinin bir önceliği, günlüğün kaynağını tanımlayan bir etiket ve gerçek günlük mesajı vardır.

Günlük kaydı sisteminin birincil C/C++ arayüzü, paylaşılan liblog kitaplığı ve bu kitaplığın <android/log.h> başlığıdır. Dile özgü tüm günlük kaydı tesisleri (android.util.Log dahil) sonunda __android_log_write işlevini çağırır. Varsayılan olarak, günlük girişini bir yuva kullanarak logd uygulamasına gönderen __android_log_logd_logger işlevini çağırır. API düzeyi 30'dan itibaren günlük kaydı işlevi, __android_set_log_writer çağrısıyla değiştirilebilir. NDK belgelerinden daha fazla bilgi edinebilirsiniz.

adb logcat tarafından görüntülenen günlükler dört filtreleme düzeyinden geçer:

Derleme zamanı filtreleme
Derleme ayarlarına bağlı olarak bazı günlükler ikili programdan tamamen kaldırılabilir. Örneğin ProGuard, Log.d için yapılan çağrıları Java kodundan kaldıracak şekilde yapılandırılabilir.
Sistem özelliği filtreleme
liblog, logd öğesine gönderilecek minimum önem düzeyini belirlemek için bir dizi sistem özelliğini sorgular. Günlüklerinizde MyApp etiketi varsa aşağıdaki özellikler kontrol edilir ve minimum önem derecesinin ilk harfini içermesi beklenir (tüm günlükleri devre dışı bırakmak için V, D, I, W, E veya S):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
Uygulama filtreleme
Özelliklerden hiçbiri ayarlanmadıysa liblog, __android_log_set_minimum_priority tarafından ayarlanan minimum önceliği kullanır. Varsayılan ayar: INFO.
Görüntü filtreleme
adb logcat, logd tarihinden itibaren gösterilen günlük miktarını azaltabilecek ek filtreleri destekler. Daha fazla bilgi için günlük çıkışını filtreleme bölümüne bakın.

Komut satırı söz dizimi

logcat eklentisini adb kabuğunda çalıştırmak için genel kullanım şu şekildedir:

[adb] shell logcat [<option>] ... [<filter-spec>] ...

adb logcat ifadesinin de bir kısaltması vardır, ancak bu kelime adb shell logcat diline genişletilir.

Seçenekler

logcat için birçok seçenek var. Hangi seçenekleri kullanabileceğiniz, kullandığınız cihazın işletim sistemi sürümüne bağlıdır. Kullandığınız cihaza özel logcat ile ilgili yardım almak için şu komutu yürütün:

    adb logcat --help
    

logcat, OS geliştiricileri ve uygulama geliştiricileri (Android Studio'yu kullanmaları beklenen uygulama geliştiricilerin) için bir araç olduğundan çoğu seçenek yalnızca root olarak kullanılabilir.

Günlük çıkışını filtrele

Günlük mesajı etiketi, mesajın kaynaklandığı sistem bileşenini gösteren kısa bir dizedir. Örneğin, görünüm sistemi için "Görünüm".

Öncelik, en düşük öncelikten en yükseğe doğru sıralanmış aşağıdaki karakter değerlerinden biridir:

    • V: Ayrıntılı (en düşük öncelik)
    • D: Hata ayıklama
    • I: Bilgi
    • W: Uyarı
    • E: Hata
    • F: Önemli
    • S: Sessiz (hiçbir şeyin yazdırılmadığı en yüksek öncelik)
  • Sistemde önceliklerle kullanılan etiketlerin listesini elde etmek için logcat komutunu çalıştırın ve her mesajın ilk iki sütununu (<priority>/<tag>) gözlemleyin.

    Aşağıda logcat -v brief output komutuyla elde edilen kısa bir logcat çıkışı örneği verilmiştir. Çıkış, mesajın "I" öncelik seviyesi ve "ActivityManager" etiketiyle ilgili olduğunu gösterir:

    I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}
    

    Günlük çıktısını yönetilebilir bir düzeye indirmek için filtre ifadeleri kullanarak günlük çıktısını kısıtlayın. Filtre ifadeleri, sisteme ilgilendiğiniz etiket öncelikli kombinasyonları belirtmenizi sağlar. Sistem, belirtilen etiketler için diğer mesajları gizler.

    Bir filtre ifadesi şu biçimdedir tag:priority .... Burada tag ilgili etiketi, priority ise bu etiket için raporlanacak minimum öncelik düzeyini belirtir. Bu etiket için belirtilen veya daha yüksek önceliğe sahip olan mesajlar günlüğe yazılır. Tek bir filtre ifadesinde istediğiniz sayıda tag:priority özelliği sağlayabilirsiniz. Spesifikasyonlar dizisi boşlukla sınırlandırılmıştır.

    Aşağıda, "ActivityManager" etiketi "Info" veya daha yüksek bir öncelik düzeyine sahip olanlar ve "MyApp" etiketine sahip ve "Debug" veya daha yüksek bir öncelik düzeyine sahip olanlar hariç tüm günlük mesajlarını gizleyen bir filtre ifadesi örneği verilmiştir:

    adb logcat ActivityManager:I MyApp:D *:S
    

    Önceki ifadedeki son öğe olan *:S, tüm etiketlerin öncelik düzeyini "sessiz" olarak ayarlar. Bu da yalnızca "ActivityManager" ve "Uygulamam" içeren günlük mesajlarının görüntülenmesini sağlar. *:S kullanımı, günlük çıktısının açıkça belirttiğiniz filtrelerle sınırlı olmasını sağlar. *:S, filtrelerinizin günlük çıktısı için izin verilenler listesi olarak işlev görmesini sağlar.

    Not: Bazı kabuklarda "*" karakteri, kabuk tarafından ayrılmıştır. Böyle bir kabuk kullanıyorsanız filtre ifadesini tırnak içine alın: adb logcat "ActivityManager:I MyApp:D *:S"

    Aşağıdaki filtre ifadesi, tüm etiketlerde "uyarı" ve daha yüksek öncelik düzeyine sahip tüm günlük mesajlarını gösterir:

    adb logcat *:W
    

    logcat uygulamasını uzak bir adb kabuğunda çalıştırmak yerine geliştirme bilgisayarınızda çalıştırıyorsanız ANDROID_LOG_TAGS ortam değişkeninin değerini dışa aktararak varsayılan filtre ifadesi de ayarlayabilirsiniz:

    export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
    

    Uzak kabuktan logcat veya adb shell logcat kullanıyorsanız ANDROID_LOG_TAGS filtresi emülatör/cihaz örneğine aktarılmaz.

    Kontrol günlüğü çıkış biçimi

    Günlük mesajları, etiket ve önceliğin yanı sıra bir dizi meta veri alanı içerir. Mesajların çıkış biçimini, belirli bir meta veri alanını görüntüleyecek şekilde değiştirebilirsiniz. Bunu yapmak için -v seçeneğini kullanın ve aşağıdaki desteklenen çıkış biçimlerinden birini belirtin:

    • brief: Mesajı yayınlayan işlemin önceliğini, etiketini ve PID'sini görüntüler.
    • long: Tüm meta veri alanlarını ve mesajları boş satırlarla gösterir.
    • process: Yalnızca PID'yi gösterir.
    • raw: Ham günlük mesajını, başka meta veri alanları olmadan gösterir.
    • tag: Yalnızca önceliği ve etiketi görüntüler.
    • thread: Mesajı veren iş parçacığının önceliğini, PID'sini ve TID'sini gösteren eski bir biçim.
    • threadtime (varsayılan): Mesajı veren iş parçacığının tarihi, çağrı saatini, önceliği, etiketini, PID'sini ve TID'sini görüntüler.
    • time: Mesajı veren işlemin tarihini, çağrı saatini, önceliğini, etiketini ve PID'sini gösterir.

    logcat özelliğini başlatırken -v seçeneğini kullanarak istediğiniz çıkış biçimini belirtin:

    [adb] logcat [-v <format>]
    

    thread çıkış biçiminde mesajların nasıl oluşturulacağını gösteren bir örneği aşağıda bulabilirsiniz:

    adb logcat -v thread
    

    -v seçeneğiyle yalnızca bir çıkış biçimi belirtebilirsiniz. Ancak mantıklı olmaları şartıyla, ihtiyaç duyduğunuz kadar değiştirici belirtebilirsiniz. logcat, anlamsız değiştiricileri yoksayar.

    Biçim değiştiriciler

    Biçim değiştiriciler, logcat çıkışını değiştirir. Biçim değiştirici belirtmek için aşağıdaki gibi -v seçeneğini kullanın:

    adb logcat -b all -v color -d
    

    Her Android günlük mesajının bir etiketi ve bununla ilişkili bir önceliği vardır. Herhangi bir biçim değiştiriciyi aşağıdaki biçim seçeneklerinden herhangi biriyle birleştirebilirsiniz:

    • brief
    • long
    • process
    • raw
    • tag
    • thread
    • threadtime
    • time

    Aşağıdaki değiştirici ayrıntılarını biçimlendirmek için komut satırına logcat -v --help yazın:

    • color: Her öncelik düzeyini farklı bir renkle gösterir.
    • descriptive: Günlük arabelleği etkinliği açıklamalarını gösterir. Bu değiştirici, yalnızca olay günlüğü arabelleği mesajlarını etkiler ve diğer ikili olmayan arabellekler üzerinde herhangi bir etkisi yoktur. Etkinlik açıklamaları, event-log-tags veritabanından gelir.
    • epoch: 1 Ocak 1970'ten itibaren zamanı saniye cinsinden gösterir.
    • monotonic: Son önyüklemeden itibaren süreyi CPU saniye cinsinden gösterir.
    • printable: Tüm ikili günlük kaydı içeriklerinin kod dışı bırakılmasını sağlar.
    • uid: Erişim denetimlerinin izin vermesi durumunda, günlüğe kaydedilen işlemin UID veya Android kimliğini gösterir.
    • usec: Saati mikrosaniye cinsinden hassas bir şekilde görüntüler.
    • UTC: Saati UTC olarak gösterir.
    • year: Yılı, gösterilen saate ekler.
    • zone: Yerel saat dilimini görüntülenen saate ekler.

    Alternatif günlük arabelleklerini göster

    Android günlük kaydı sistemi, günlük mesajları için birden fazla dairesel arabelleğe alır ve günlük mesajlarının hepsi varsayılan döngüsel arabelleğe gönderilmez. Ek günlük mesajlarını görmek amacıyla, alternatif bir dairesel arabelleğin görüntülenmesini istemek için logcat komutunu -b seçeneğiyle çalıştırın. Şu alternatif arabelleklerden herhangi birini görüntüleyebilirsiniz:

    • radio: Radyo/telefon ile ilgili mesajları içeren arabelleği görüntüler.
    • events: Yorumlanan ikili sistem etkinliği arabellek mesajlarını görüntüler.
    • main: Sistem ve kilitlenme günlük mesajlarını içermeyen ana günlük arabelleğini (varsayılan) görüntüler.
    • system: Sistem günlüğü arabelleğini görüntüler (varsayılan).
    • crash: Kilitlenme günlüğü arabelleğini görüntüler (varsayılan).
    • all: Tüm arabellekleri görüntüler.
    • default: Raporlar main, system ve crash arabellekleri.

    -b seçeneğinin kullanımı:

    [adb] logcat [-b <buffer>]
    

    Radyo ve telefon mesajları içeren bir günlük arabelleğinin nasıl görüntüleneceğine dair bir örnek aşağıda verilmiştir:

    adb logcat -b radio
    

    Yazdırmak istediğiniz tüm arabellekler için birden fazla -b işareti belirtmek üzere aşağıdakileri girin:

    logcat -b main -b radio -b events
    

    Virgülle ayrılmış arabellek listesi içeren tek bir -b işareti belirtin. Örneğin:

    logcat -b main,radio,events
    

    Koddan günlüğe kaydet

    Log sınıfı, kodunuzda logcat aracında görüntülenen günlük girişleri oluşturmanıza olanak tanır. Yaygın olarak kullanılan günlük kaydı yöntemleri şunlardır:

    Örneğin, aşağıdaki çağrıyı kullanarak:

    Kotlin

    Log.i("MyActivity", "MyClass.getView() — get item number $position")
    

    Java

    Log.i("MyActivity", "MyClass.getView() — get item number " + position);
    

    logcat işlevinin çıktısı şuna benzer:

    I/MyActivity( 1557): MyClass.getView() — get item number 1