Logcat adalah alat command line yang mengeluarkan log pesan sistem, termasuk pelacakan tumpukan, saat
perangkat menampilkan error dan 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 informasi cara menampilkan dan memfilter log dari Android Studio, lihat Menulis dan Menampilkan Log dengan Logcat.
Ringkasan sistem logging
Sistem logging Android adalah kumpulan buffer sirkular terstruktur yang dikelola oleh proses
sistem logd
. Kumpulan buffer yang tersedia bersifat tetap dan ditentukan oleh
sistem. Yang paling relevan adalah: main
yang menyimpan sebagian besar log aplikasi,
system
yang menyimpan pesan yang berasal dari Android OS, dan
crash
yang menyimpan log error. Setiap entri log memiliki prioritas
(salah satu dari VERBOSE
, DEBUG
, INFO
, WARNING
,
ERROR
, atau FATAL
), tag yang mengidentifikasi asal 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 keseriusan minimum yang akan dikirim kelogd
. Jika log Anda memiliki tagMyApp
, properti berikut akan diperiksa, dan diharapkan berisi huruf pertama tingkat keseriusan minimum (V
,D
,I
,W
,E
, atauS
untuk menonaktifkan semua log): log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
- Pemfilteran aplikasi: Jika tidak ada properti yang ditetapkan,
liblog
menggunakan prioritas minimum yang ditetapkan oleh__android_log_set_minimum_priority
. Setelan default-nya adalahINFO
. - Pemfilteran tampilan:
adb logcat
mendukung filter tambahan yang dapat mengurangi jumlah log yang ditampilkan darilogd
. Lihat detailnya di bawah ini.
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
dari 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 jalankan:
adb logcat --help
Anda dapat membuat koneksi shell ke perangkat dan menjalankan:
$ adb shell # logcat
Opsi
Tabel berikut menjelaskan opsi command line logcat
.
Opsi | Deskripsi |
---|---|
-b <buffer> |
Memuat buffer log alternatif untuk ditampilkan, misalnya events atau
radio . Kumpulan buffer main , system , dan crash
digunakan secara default. Lihat Menampilkan Buffer Log Alternatif. |
-c, --clear |
Menghapus (flush) buffer yang dipilih, lalu keluar. Kumpulan buffer default adalah main ,
system , dan crash . Untuk menghapus semua buffer, gunakan
-b all -c .
|
|
Hanya mencetak baris yang pesan log-nya cocok dengan <expr>
dan <expr> merupakan ekspresi reguler. |
|
Berhenti setelah mencetak <count> jumlah baris. Opsi ini dimaksudkan untuk
dipasangkan dengan --regex , tetapi akan berfungsi dengan sendirinya. |
--print |
Dipasangkan dengan --regex dan --max-count
untuk memungkinkan konten 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 buffer 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> |
Menetapkan format output untuk pesan log. Default-nya adalah format threadtime . Untuk
daftar format yang didukung, buka bagian tentang Mengontrol format
output log.
|
-D, --dividers |
Mencetak pembagi antara setiap buffer log. |
-c |
Menghapus (flush) 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 sematan.
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 sematan.
adb logcat -t '01-26 20:52:41.820' |
-L, -last |
Mengeluarkan log sebelum reboot terakhir. |
-B, --binary |
Meng-output log dalam sistem biner. |
-S, --statistics |
Menyertakan statistik dalam output untuk membantu Anda mengidentifikasi dan menargetkan spammer log. |
-G <size> |
Menetapkan ukuran buffer ring log. Dapat menambahkan
K atau M di bagian akhir untuk menunjukkan
kilobyte atau megabyte. |
-p, --prune |
Mencetak (membaca) daftar yang diizinkan (white ) dan ditolak (black ) saat ini serta
tidak menggunakan argumen, sebagai berikut:
adb logcat -p |
-P '<list> ...'
|
Menulis (menetapkan) daftar izin (white ) dan tolak (black ) untuk menyesuaikan
konten logging untuk tujuan tertentu. Anda memberikan konten campuran dari entri daftar yang diizinkan
(<white> ) dan ditolak (~<black> ), dengan
<white> atau <black> dapat berupa UID, UID/PID, atau /PID. Dengan
panduan dari statistik logcat (logcat -S ), orang dapat mempertimbangkan penyesuaian
pada daftar yang diizinkan (white ) dan ditolak (black ) untuk keperluan seperti:
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 ( Tanda kutip
$ adb logcat -P '"<white_and_blacklist>"' or adb shell $ logcat -P '<white_and_blacklist>'
Contoh berikut menetapkan daftar yang diizinkan ( adb logcat -P '"/32676 675 ~/32677 897"'
Variasi perintah daftar yang diizinkan ( ~! worst uid blacklist ~1000/! worst pid in system (1000) |
--pid=<pid> ... |
Hanya mencetak log dari PID yang ditentukan. |
--wrap |
Tidur selama 2 jam atau saat buffer akan segera dikemas, salah satu yang terjadi lebih dulu. Meningkatkan efisiensi polling dengan menyediakan layanan pengaktifan saat buffer akan segera dikemas. |
Memfilter log output
- Tag dari sebuah 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
: DebugI
: InfoW
: WarningE
: ErrorF
: FatalS
: Silent (prioritas tertinggi, tidak ada apa pun yang dicetak)
Anda dapat memperoleh daftar tag yang digunakan dalam sistem, beserta prioritasnya, dengan menjalankan
logcat dan mengamati dua kolom pertama setiap pesan, yang diberikan sebagai
<priority>/<tag>
.
Berikut adalah contoh output logcat singkat yang diperoleh dengan
perintah logcat -v brief output
. Ini 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, Anda dapat membatasi output log menggunakan ekspresi filter. Ekspresi filter memungkinkan Anda menunjukkan kombinasi tag-prioritas yang Anda ingin lihat kepada sistem — sistem akan menyembunyikan pesan lain untuk menampilkan tag yang ditetapkan tersebut.
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. Anda dapat menyediakan 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 lebih tinggi, dan semua pesan log yang memiliki tag "MyApp" dengan prioritas "Debug" atau lebih tinggi:
adb logcat ActivityManager:I MyApp:D *:S
Elemen terakhir dalam ekspresi di atas, *:S
, menetapkan tingkat prioritas untuk semua
tag ke "silent", yang memastikan bahwa sistem hanya akan menampilkan pesan log dengan tag "ActivityManager" dan "MyApp". Menggunakan
*:S
adalah cara terbaik untuk memastikan bahwa output log dibatasi ke filter yang
telah Anda tetapkan secara eksplisit — dengan begitu filter Anda akan berfungsi sebagai daftar yang diizinkan untuk output
log.
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 (bukan menjalankannya pada
shell adb jarak jauh), Anda juga dapat menetapkan ekspresi filter default dengan mengekspor nilai untuk
variabel lingkungan ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Perhatikan bahwa 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. Caranya,
gunakan opsi -v
dan tetapkan salah satu format output yang didukung yang tercantum
di bawah.
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, Anda dapat menentukan 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
Perhatikan bahwa Anda hanya dapat menentukan satu format output dengan opsi -v
, tetapi Anda dapat
menentukan sebanyak mungkin pengubah yang relevan. Logcat akan mengabaikan pengubah yang tidak relevan.
Pengubah format
Pengubah format mengubah output logcat dalam hal kombinasi dari satu atau
beberapa pengubah berikut. 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.
Anda dapat menggabungkan pengubah format dengan salah satu opsi format berikut: brief
,
long
, process
, raw
, tag
,
thread
, threadtime
, dan time
.
Anda dapat memperoleh detail pengubah format dengan mengetik logcat -v --help
pada command line.
color
: Menampilkan setiap tingkat prioritas dengan warna yang berbeda.descriptive
: Menampilkan deskripsi peristiwa buffer log. Pengubah ini hanya memengaruhi pesan buffer log peristiwa dan tidak berpengaruh pada buffer non-biner lainnya. Deskripsi peristiwa berasal dari database tag log peristiwa.epoch
: Menampilkan waktu dalam detik, mulai dari tanggal 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 hingga mikrodetik.UTC
: Menampilkan waktu sebagai UTC.year
: Menambahkan tahun ke waktu yang ditampilkan.zone
: Menambahkan zona waktu lokal ke waktu yang ditampilkan.
Menampilkan buffer log alternatif
Sistem logging Android mempertahankan beberapa buffer sirkuler untuk pesan log, dan tidak semua
pesan log dikirim ke buffer sirkular default. Untuk melihat pesan log tambahan, Anda dapat
menjalankan perintah logcat
dengan opsi -b
, untuk membuat permintaan menampilkan
buffer sirkular alternatif. Anda bisa menampilkan semua buffer sirkuler alternatif ini:
radio
: Menampilkan buffer yang berisi pesan-pesan terkait radio/telepon.events
: Menampilkan pesan buffer peristiwa sistem biner yang ditafsirkan.main
: Menampilkan buffer log utama (default), tidak memuat pesan log sistem dan error.system
: Menampilkan buffer log sistem (default).crash
: Menampilkan buffer log error (default).all
: Menampilkan semua buffer.default
: Melaporkan buffermain
,system
, dancrash
.
Penggunaan opsi -b
adalah:
[adb] logcat [-b <buffer>]
Berikut adalah contoh cara menampilkan buffer log yang berisi pesan telepon dan radio:
adb logcat -b radio
Anda juga dapat menentukan beberapa flag -b
untuk semua buffer yang ingin dicetak,
seperti berikut:
logcat -b main -b radio -b events
Anda dapat menentukan 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
dalam alat logcat. Metode logging biasanya meliputi:
Log.v(String, String)
(verbose)Log.d(String, String)
(debug)Log.i(String, String)
(information/informasi)Log.w(String, String)
(warning/peringatan)Log.e(String, String)
(error)
Misalnya, menggunakan panggilan berikut:
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
Output logcat akan menjadi seperti:
I/MyActivity( 1557): MyClass.getView() — get item number 1