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üklerinizdeMyApp
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çinV
,D
,I
,W
,E
veyaS
):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ıklamaI
: BilgiW
: UyarıE
: HataF
: ÖnemliS
: 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
: Raporlarmain
,system
vecrash
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:
Log.v(String, String)
(ayrıntılı)Log.d(String, String)
(hata ayıklama)Log.i(String, String)
(bilgi)Log.w(String, String)
(uyarı)Log.e(String, String)
(hata)
Ö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