Alat command line logcat

Logcat adalah alat command line yang mengeluarkan log pesan sistem saat perangkat menampilkan error dan mengirim pesan yang telah Anda tulis dari aplikasi dengan class Log.

Halaman ini membahas alat command line logcat, tetapi Anda juga bisa melihat pesan log dari jendela Logcat pada Android Studio. Untuk mengetahui informasi cara menampilkan dan memfilter log dari Android Studio, lihat Menampilkan dan menulis log dengan Logcat.

Ringkasan sistem logging

Sistem logging Android adalah kumpulan buffer sirkular terstruktur yang dikelola oleh proses sistem logd. Kumpulan buffering yang tersedia bersifat tetap dan ditentukan oleh sistem. Buffering yang paling relevan adalah:

  • main: Menyimpan sebagian besar log aplikasi.
  • system: Menyimpan pesan yang berasal dari Android OS.
  • crash: Menyimpan log error. Setiap entri log memiliki prioritas, tag yang mengidentifikasi origin log, dan pesan log itu sendiri.

Antarmuka utama ke sistem logging adalah library bersama liblog dan header-nya <android/log.h>. Semua fasilitas logging khusus bahasa pada akhirnya akan memanggil fungsi __android_log_write. Secara default, ini akan memanggil fungsi __android_log_logd_logger, yang mengirimkan entri log ke logd menggunakan soket. Dimulai dengan API level 30, fungsi logging dapat diubah dengan memanggil __android_set_log_writer. Informasi selengkapnya tersedia di Dokumentasi NDK.

Log yang ditampilkan oleh adb logcat melalui empat tingkat pemfilteran:

Pemfilteran waktu kompilasi
Bergantung pada setelan kompilasi, beberapa log mungkin sepenuhnya dihapus dari sistem biner. Misalnya, ProGuard dapat dikonfigurasi untuk menghapus panggilan ke Log.d dari kode Java.
Pemfilteran properti sistem
liblog mengkueri kumpulan properti sistem untuk menentukan tingkat keparahan minimum yang akan dikirim ke logd. Jika log Anda memiliki tag MyApp, properti berikut akan diperiksa, dan diharapkan berisi huruf pertama tingkat keparahan minimum (V, D, I, W, E, atau S untuk menonaktifkan semua log):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
Pemfilteran aplikasi
Jika tidak ada properti yang disetel, liblog akan menggunakan prioritas minimum yang disetel oleh __android_log_set_minimum_priority. Setelan default-nya adalah INFO.
Pemfilteran tampilan
adb logcat mendukung filter tambahan yang dapat mengurangi jumlah log yang ditampilkan dari logd. Lihat bagian tentang memfilter output log untuk detail selengkapnya.

Sintaksis command line

Untuk menjalankan logcat melalui shell adb, penggunaan umumnya adalah:

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

Anda dapat menjalankan logcat sebagai perintah adb atau secara langsung di prompt shell pada emulator atau perangkat terhubung. Untuk melihat output log menggunakan adb, buka direktori platform-tools/ SDK lalu jalankan:

adb logcat

Untuk bantuan online logcat, mulai perangkat, lalu eksekusi:

adb logcat --help

Buat koneksi shell ke perangkat dan eksekusi:

$ adb shell
# logcat

Opsi

Tabel berikut menjelaskan opsi command line untuk logcat:

Opsi Deskripsi
-b <buffer> Memuat buffering log alternatif untuk ditampilkan, misalnya events atau radio. Kumpulan buffering main, system, dan crash digunakan secara default. Lihat bagian tentang menampilkan buffering log alternatif.
-c, --clear Menghapus buffering yang dipilih dan keluar. Kumpulan buffering default adalah main, system, dan crash. Untuk menghapus semua buffering, gunakan -b all -c.
-e <expr>, --regex=<expr> Hanya mencetak baris yang pesan log-nya cocok dengan <expr> dan <expr> merupakan ekspresi reguler.
-m <count>, --max-count=<count> Berhenti setelah mencetak <count> jumlah baris. Opsi ini dimaksudkan untuk disambungkan dengan --regex, tetapi akan berfungsi dengan sendirinya.
--print Jika disambungkan dengan --regex dan --max-count, konten dapat mengabaikan filter ekspresi reguler, tetapi tetap berhenti pada jumlah kecocokan yang tepat.
-d Mengeluarkan log ke layar, lalu keluar.
-f <filename> Menulis output pesan log ke <filename>. Default-nya adalah stdout.
-g, --buffer-size Mencetak ukuran buffering log yang ditetapkan, lalu keluar.
-n <count> Menyetel jumlah maksimum log yang dirotasi ke <count>. Nilai defaultnya adalah 4. Memerlukan opsi -r.
-r <kbytes> Merotasi file log setiap <kbytes> dari output. Nilai defaultnya adalah 16. Memerlukan opsi -f.
-s Setara dengan ekspresi filter '*:S', yang menetapkan prioritas untuk semua tag ke silent, dan digunakan untuk mendahului daftar ekspresi filter yang menambahkan konten. Untuk mempelajari lebih lanjut, buka bagian tentang memfilter output log.
-v <format> Menyetel format output untuk pesan log. Default-nya adalah format threadtime. Untuk daftar format yang didukung, lihat bagian tentang mengontrol format output log.
-D, --dividers Mencetak pembagi antara setiap buffering log.
-c Menghapus seluruh log, lalu keluar.
-t <count> Mencetak hanya jumlah baris terbaru. Opsi ini menyertakan fungsionalitas -d.
-t '<time>' Mencetak baris terbaru sejak waktu yang ditentukan. Opsi ini menyertakan fungsionalitas -d. Lihat opsi -P untuk informasi cara mengutip parameter dengan ruang tersemat.

adb logcat -t '01-26 20:52:41.820'
-T <count> Mencetak jumlah baris terbaru sejak waktu yang ditentukan. Opsi ini tidak menyertakan fungsionalitas -d.
-T '<time>' Mencetak baris terbaru sejak waktu yang ditentukan. Opsi ini tidak menyertakan fungsionalitas -d. Lihat opsi -P untuk informasi cara mengutip parameter dengan ruang tersemat.

adb logcat -t '01-26 20:52:41.820'
-L, --last Mengeluarkan log sebelum mulai ulang terakhir.
-B, --binary Menghasilkan log dalam biner.
-S, --statistics Menyertakan statistik dalam output untuk membantu Anda mengidentifikasi dan menargetkan spammer log.
-G <size> Menetapkan ukuran buffering ring log. Anda dapat menambahkan K atau M di bagian akhir untuk menunjukkan kilobyte atau megabyte.
-p, --prune Mencetak daftar yang diizinkan dan ditolak, serta tidak menggunakan argumen, sebagai berikut:

adb logcat -p
-P '<list> ...'
--prune '<list> ...' -P '<allowlist_and_denylist>'
Menulis daftar yang diizinkan dan ditolak guna menyesuaikan konten logging untuk tujuan tertentu. Anda memberikan konten campuran dari entri daftar yang diizinkan dan ditolak, dengan <allowlist> atau <denylist> dapat berupa UID, UID/PID, atau PID. Dengan mengacu pada statistik logcat (logcat -S), Anda dapat mempertimbangkan penyesuaian pada daftar yang diizinkan dan ditolak untuk tujuan seperti:
  • Memberikan umur terpanjang kepada konten logging tertentu melalui pemilihan UID.
  • Mencegah pengguna (UID) atau proses (PID) menggunakan resource ini untuk membantu meningkatkan logspan sehingga Anda lebih mudah melihat masalah yang sedang didiagnosis.

Secara default, sistem logging otomatis mencegah pelanggar terburuk dalam statistik log secara dinamis untuk memberi ruang bagi pesan log baru. Setelah heuristik habis, sistem akan memangkas entri yang paling lama untuk memberi ruang bagi pesan baru.

Penambahan daftar yang diizinkan akan melindungi nomor Identifikasi Android (AID) Anda, yang menjadi AID dan GID untuk proses, sehingga tidak dinyatakan sebagai pelanggar. Penambahan daftar yang ditolak akan membantu Anda mengosongkan ruang sebelum mempertimbangkan pelanggar terburuk. Anda dapat memilih seberapa aktif pruning ini, dan dapat menonaktifkan pruning sehingga hanya menghapus konten dari entri terlama di setiap buffering log.

Tanda kutip

adb logcat tidak mempertahankan tanda kutip, sehingga sintaksis untuk menentukan daftar yang diizinkan dan ditolak adalah sebagai berikut:


$ adb logcat -P '"<allowlist_and_denylist>"'

or

adb shell
$ logcat -P '<allowlist_and_denylist>'

Contoh berikut menetapkan daftar yang diizinkan dengan PID 32676 dan UID 675, serta daftar yang ditolak dengan PID 32677 dan UID 897. PID 32677 pada daftar yang ditolak diberi bobot untuk pruning yang lebih cepat.


adb logcat -P '"/32676 675 ~/32677 897"'

Anda dapat menggunakan variasi perintah daftar yang diizinkan dan ditolak berikut:


~! worst uid denylist
~1000/! worst pid in system (1000)
--pid=<pid> ... Hanya mencetak log dari PID yang ditentukan.
--uid=<uids> ... Hanya menampilkan pesan log dari UID yang ada dalam daftar yang dipisahkan koma <uids>. Tidak ada pencarian nama yang dilakukan, sehingga UID harus diberikan sebagai nilai numerik. Opsi ini hanya berguna untuk pengguna 'root', 'log', dan 'sistem', karena hanya pengguna tersebut yang dapat melihat log dari pengguna lain.
--wrap Saat masuk ke mode tidur selama 2 jam atau saat buffering akan segera dikemas, mana pun yang terjadi lebih dulu. Meningkatkan efisiensi polling dengan menyediakan layanan pengaktifan saat buffering akan segera dikemas.

Memfilter output log

Tag pesan log adalah string singkat yang menunjukkan komponen sistem tempat asal pesan tersebut. Misalnya, "View" untuk sistem tampilan.

Prioritasnya adalah salah satu dari nilai karakter berikut, diurutkan dari prioritas terendah ke tertinggi:

    • V: Verbose (prioritas terendah)
    • D: Debug
    • I: Info
    • W: Warning
    • E: Error
    • F: Fatal
    • S: Silent (prioritas tertinggi, tidak ada apa pun yang dicetak)
  • Untuk mendapatkan daftar tag yang digunakan dalam sistem dengan prioritas, jalankan logcat dan amati dua kolom pertama setiap pesan, yang diberikan sebagai <priority>/<tag>.

    Berikut adalah contoh output logcat singkat yang diperoleh dengan perintah logcat -v brief output. Output menunjukkan bahwa pesan tersebut berkaitan dengan tingkat prioritas "I" dan tag "ActivityManager":

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

    Untuk mengurangi output log ke tingkat yang mudah dikelola, batasi output log menggunakan ekspresi filter. Ekspresi filter memungkinkan Anda menunjukkan kombinasi prioritas tag yang Anda inginkan kepada sistem. Sistem akan menyembunyikan pesan lain untuk menampilkan tag yang ditentukan.

    Ekspresi filter mengikuti format tag:priority ... ini, dengan tag menunjukkan tag yang diminati dan priority menunjukkan tingkat minimum prioritas yang akan dilaporkan untuk tag tersebut. Pesan untuk tag tersebut, yang berada pada atau di atas tingkat prioritas yang ditentukan, akan ditulis ke log. Sediakan berapa pun spesifikasi tag:priority dalam ekspresi filter tunggal. Rangkaian spesifikasi dibatasi oleh spasi kosong.

    Berikut adalah contoh ekspresi filter yang menyembunyikan semua pesan log kecuali yang memiliki tag "ActivityManager" dengan prioritas "Info" atau yang lebih tinggi dan pesan log yang memiliki tag "MyApp" dengan prioritas "Debug" atau yang lebih tinggi:

    adb logcat ActivityManager:I MyApp:D *:S
    

    Elemen terakhir dalam ekspresi sebelumnya, *:S, menyetel tingkat prioritas untuk semua tag ke "silent", yang memastikan bahwa hanya pesan log dengan "ActivityManager" dan "MyApp" yang ditampilkan. Menggunakan *:S akan memastikan bahwa output log dibatasi ke filter yang telah Anda tetapkan secara eksplisit. *:S memungkinkan filter Anda berfungsi sebagai daftar yang diizinkan untuk output log.

    Catatan: Di beberapa shell, karakter "*" disediakan oleh shell. Jika Anda menggunakan shell tersebut, sertakan ekspresi filter dalam tanda kutip: adb logcat "ActivityManager:I MyApp:D *:S"

    Ekspresi filter berikut menampilkan semua pesan log dengan tingkat prioritas "warning" dan yang lebih tinggi, pada semua tag:

    adb logcat *:W
    

    Jika Anda menjalankan logcat dari komputer pengembangan Anda, bukan menjalankannya di shell adb jarak jauh, Anda juga dapat menyetel ekspresi filter default dengan mengekspor nilai untuk variabel lingkungan ANDROID_LOG_TAGS:

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

    Filter ANDROID_LOG_TAGS tidak akan diekspor ke instance emulator/perangkat jika Anda menjalankan logcat dari shell jarak jauh atau menggunakan adb shell logcat.

    Mengontrol format output log

    Pesan log berisi sejumlah kolom metadata, selain tag dan prioritas. Anda dapat mengubah format output pesan agar menampilkan kolom metadata tertentu. Untuk melakukannya, gunakan opsi -v dan tetapkan salah satu format output yang didukung berikut:

    • brief: Menampilkan prioritas, tag, dan PID dari proses yang mengeluarkan pesan.
    • long: Menampilkan semua kolom metadata dan memisahkan pesan dengan baris kosong.
    • process: Hanya menampilkan PID.
    • raw: Menampilkan pesan log mentah tanpa kolom metadata lainnya.
    • tag: Hanya menampilkan prioritas dan tag.
    • thread: Format lama yang menunjukkan prioritas, PID, dan TID dari thread yang mengeluarkan pesan.
    • threadtime (default): Menampilkan tanggal, waktu pemanggilan, prioritas, tag, PID, dan TID dari thread yang mengeluarkan pesan.
    • time: Menampilkan tanggal, waktu pemanggilan, prioritas, tag, dan PID dari proses yang mengeluarkan pesan.

    Saat memulai logcat, tentukan format output yang diinginkan dengan menggunakan opsi -v:

    [adb] logcat [-v <format>]
    

    Berikut adalah contoh yang menunjukkan cara menghasilkan pesan dalam format output thread:

    adb logcat -v thread
    

    Anda hanya dapat menentukan satu format output dengan opsi -v. Namun, Anda dapat menentukan sebanyak mungkin pengubah yang diperlukan, asalkan pengubah tersebut relevan. logcat mengabaikan pengubah yang tidak relevan.

    Pengubah format

    Pengubah format mengubah output logcat. Untuk menentukan pengubah format, gunakan opsi -v, seperti berikut:

    adb logcat -b all -v color -d
    

    Setiap pesan log Android memiliki tag dan prioritas yang terkait dengannya. Anda dapat menggabungkan pengubah format dengan salah satu opsi format berikut:

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

    Untuk memformat detail pengubah berikut, masukkan logcat -v --help pada command line:

    • color: Menampilkan setiap tingkat prioritas dengan warna yang berbeda.
    • descriptive: Menampilkan deskripsi peristiwa buffering log. Pengubah ini hanya memengaruhi pesan buffering log peristiwa dan tidak berpengaruh pada buffering non-biner lainnya. Deskripsi peristiwa berasal dari database tag log peristiwa.
    • epoch: Menampilkan waktu dalam detik, mulai 1 Januari 1970.
    • monotonic: Menampilkan waktu dalam detik CPU, dimulai dari booting terakhir.
    • printable: Memastikan bahwa setiap konten logging biner di-escape.
    • uid: Menampilkan UID atau ID Android dari proses yang dicatat, jika diizinkan oleh kontrol akses.
    • usec: Menampilkan waktu, dengan presisi dalam mikrodetik.
    • UTC: Menampilkan waktu sebagai UTC.
    • year: Menambahkan tahun ke waktu yang ditampilkan.
    • zone: Menambahkan zona waktu lokal ke waktu yang ditampilkan.

    Menampilkan buffering log alternatif

    Sistem logging Android mempertahankan beberapa buffering sirkular untuk pesan log, dan tidak semua pesan log dikirim ke buffering sirkular default. Untuk melihat pesan log tambahan, jalankan perintah logcat dengan opsi -b untuk membuat permintaan menampilkan buffering sirkular alternatif. Anda dapat menampilkan semua buffering sirkular alternatif ini:

    • radio: Menampilkan buffering yang berisi pesan-pesan terkait radio/telepon.
    • events: Menampilkan pesan buffering peristiwa sistem biner yang ditafsirkan.
    • main: Menampilkan buffering log utama (default), yang tidak berisi pesan log sistem dan error.
    • system: Menampilkan buffering log sistem (default).
    • crash: Menampilkan buffering log error (default).
    • all: Menampilkan semua buffering.
    • default: Melaporkan buffering main, system, dan crash.

    Penggunaan opsi -b adalah:

    [adb] logcat [-b <buffer>]
    

    Berikut adalah contoh cara menampilkan buffering log yang berisi pesan telepon dan radio:

    adb logcat -b radio
    

    Untuk menentukan beberapa flag -b bagi semua buffering yang ingin Anda cetak, masukkan parameter berikut:

    logcat -b main -b radio -b events
    

    Tentukan satu flag -b dengan daftar buffer yang dipisahkan koma, misalnya:

    logcat -b main,radio,events
    

    Membuat log dari kode

    Class Log memungkinkan Anda membuat entri log dalam kode yang ditampilkan di alat logcat. Metode logging biasanya meliputi:

    Misalnya, menggunakan panggilan berikut:

    Kotlin

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

    Java

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

    logcat menghasilkan output yang mirip dengan berikut ini:

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