Menulis dan melihat log dengan Logcat

Jendela Logcat di Android Studio menampilkan pesan sistem, seperti kapan pembersihan sampah memori dilakukan, dan pesan yang telah Anda tambahkan ke aplikasi dengan class Log . Logcat ini menampilkan pesan secara real time dan menyimpan histori sehingga Anda dapat melihat pesan yang lebih lama.

Untuk menampilkan informasi yang diminati saja, Anda dapat membuat filter, memodifikasi banyaknya informasi yang ditampilkan dalam pesan, menetapkan tingkat prioritas, menampilkan pesan yang dihasilkan oleh kode aplikasi saja, dan menelusuri log. Secara default, Logcat menampilkan output log yang terkait dengan aplikasi yang baru saja dijalankan.

Saat aplikasi menampilkan pengecualian, Logcat menampilkan pesan yang diikuti dengan pelacakan tumpukan terkait yang berisi link ke baris kode.

Jendela Run menampilkan pesan log untuk aplikasi yang sedang berjalan saat ini. Anda dapat mengonfigurasi tampilan output Logcat, tetapi tidak untuk jendela Run.

Melihat log aplikasi Anda

Untuk menampilkan pesan log sebuah aplikasi:

  1. Build dan jalankan aplikasi Anda di perangkat.
  2. Klik View > Tool Windows > Logcat, atau klik Logcat di panel jendela alat.

Jendela Logcat menampilkan pesan log untuk aplikasi yang dipilih dari menu di bagian atas jendela, seperti ditunjukkan pada gambar 1.

Gambar 1. Jendela Logcat.

Secara default, Logcat hanya menampilkan pesan log untuk aplikasi yang sedang berjalan di perangkat. Untuk mengubah perilaku default ini, lihat cara memfilter pesan logcat.

Toolbar Logcat menyediakan tombol-tombol berikut:

  1. Clear logcat : Klik untuk menghapus log yang terlihat.
  2. Scroll to the end : Klik untuk melompat ke bagian bawah log dan melihat pesan log terbaru. Jika Anda kemudian mengklik sebuah baris dalam log, tampilan akan menjeda scroll pada titik itu.
  3. Up the stack trace dan Down the stack trace : Klik untuk menavigasi ke atas dan ke bawah pelacakan tumpukan dalam log, memilih nama file sebelumnya atau berikutnya yang muncul dalam pengecualian yang dicetak. Perilaku ini sama dengan ketika Anda mengklik nama file dalam log.
  4. Use soft wraps : Klik untuk mengaktifkan penggabungan baris dan mencegah scrolling horizontal. Tetapi, string yang tidak dapat dipecah tetap memerlukan scrolling horizontal.
  5. Print : Klik untuk mencetak pesan Logcat. Setelah memilih preferensi cetak dalam dialog yang ditampilkan, Anda juga dapat memilih untuk menyimpan pesan sebagai PDF.
  6. Restart : Klik untuk menghapus log dan memulai ulang Logcat. Tidak seperti tombol Clear Logcat, tindakan ini akan memulihkan dan menampilkan pesan log sebelumnya, jadi sangat berguna jika Logcat menjadi tidak responsif dan Anda tidak ingin kehilangan pesan log.
  7. Logcat header : Klik untuk membuka dialog Configure Logcat Header, tempat Anda dapat menyesuaikan tampilan setiap pesan Logcat, seperti apakah akan menampilkan tanggal dan waktu atau tidak.
  8. Screen capture : Klik untuk mengambil screenshot.
  9. Screen record : Klik untuk merekam video perangkat selama maksimum 3 menit.

Menulis pesan log

Class Log memungkinkan Anda membuat pesan log yang ditampilkan di Logcat. Setiap pesan log Android memiliki tag dan prioritas yang terkait dengannya. Tag pesan log sistem adalah string pendek yang menunjukkan komponen sistem tempat pesan berasal.

Gunakan metode log berikut, yang tercantum dalam urutan dari prioritas tertinggi hingga terendah:

Tag yang ditentukan pengguna dapat berupa string apa pun yang menurut Anda bermanfaat, seperti nama class saat ini. Anda menentukan tag dalam panggilan metode Log, misalnya:

Kotlin

Log.d(tag, message)

Java

Log.d(tag, message);

Lihat deskripsi class Log untuk daftar opsi yang lebih lengkap.

Jangan pernah mengompilasi log panjang ke dalam aplikasi Anda, kecuali selama pengembangan. Log debug dikompilasi, tetapi dihilangkan pada saat runtime. Log error, peringatan, dan info selalu disimpan.

Untuk setiap metode log, parameter pertama harus berupa tag unik dan parameter kedua harus berupa pesan. Tag pesan log sistem adalah string pendek yang menunjukkan komponen sistem tempat pesan berasal. Tag bisa berupa string apa pun yang Anda anggap berguna, misalnya nama class saat ini.

Akan lebih baik jika Anda mendeklarasikan konstanta TAG dalam class Anda untuk digunakan pada parameter pertama. Misalnya, Anda dapat membuat pesan log informasi seperti berikut:

Kotlin

private const val TAG = "MyActivity"
...
Log.i(TAG, "MyClass.getView() — get item number $position")

Java

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);

Catatan: Nama tag yang lebih dari 23 karakter akan terpotong dalam output Logcat.

Format pesan Logcat

Format pesan log adalah:

date time PID-TID/package
priority/tag: message

PID adalah singkatan dari "process identifier" dan TID adalah "thread identifier". Keduanya bisa sama jika hanya ada satu thread.

Misalnya, pesan log berikut memiliki prioritas V dan tag AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

Menetapkan level log

Anda dapat menetapkan level log untuk mengontrol apakah Logcat menampilkan semua pesan atau hanya pesan yang menunjukkan kondisi yang paling parah.

Logcat terus mengumpulkan semua pesan, terlepas dari setelan level log. Setelan ini hanya menentukan apa yang ditampilkan oleh Logcat.

Pada menu Log level, pilih salah satu nilai berikut:

  • Verbose: Menampilkan semua pesan log (default).
  • Debug: Menampilkan pesan log debug yang berguna selama pengembangan saja, serta level pesan yang lebih rendah dalam daftar ini.
  • Info: Menampilkan pesan log yang diharapkan untuk penggunaan reguler, serta level pesan yang lebih rendah dalam daftar ini.
  • Warn: Menampilkan kemungkinan masalah yang belum menjadi error, serta level pesan yang lebih rendah dalam daftar ini.
  • Error: Menampilkan masalah yang mengakibatkan error, serta pesan dengan tingkat yang lebih rendah dalam daftar ini.
  • Assert: Menampilkan masalah yang tidak pernah diharapkan terjadi oleh developer.

Menelusuri pesan Logcat

Untuk menelusuri pesan yang saat ini ditampilkan di Logcat:

  1. (Opsional) Pilih Regex jika Anda ingin menggunakan pola penelusuran ekspresi reguler.
  2. Ketikkan rangkaian karakter dalam kolom penelusuran .

    Tampilan output Logcat berubah sesuai penelusuran Anda.

  3. Tekan Enter untuk menyimpan string penelusuran di menu selama sesi.
  4. Untuk mengulangi penelusuran, pilih string dari menu penelusuran. Pilih atau batalkan pilihan Regex sesuai kebutuhan.

Memfilter pesan Logcat

Salah satu cara untuk mengurangi output log ke tingkat yang mudah dikelola adalah dengan membatasinya menggunakan filter.

Catatan: Filter berlaku pada histori Logcat lengkap, bukan hanya pada pesan yang saat ini ditampilkan di Logcat. Pastikan opsi tampilan yang lain disetel dengan tepat sehingga Anda dapat melihat output filter yang ingin diperiksa.

Untuk menetapkan dan menerapkan filter:

  1. Pada menu filter, pilih sebuah opsi filter:
    • Show only selected application: Hanya menampilkan pesan yang dihasilkan oleh kode aplikasi (default). Logcat memfilter pesan log menggunakan PID aplikasi aktif.
    • No Filters: Filter tidak diterapkan. Logcat menampilkan semua pesan log dari perangkat, mana pun proses yang Anda pilih.
    • Edit Filter Configuration: Membuat atau memodifikasi filter kustom. Misalnya, Anda dapat membuat filter untuk menampilkan pesan log dari dua aplikasi secara bersamaan.

    Setelah menetapkan filter, Anda juga dapat memilihnya pada menu. Untuk menghapus filter dari menu, lakukan secara langsung.

  2. Jika Anda memilih Edit Filter Configuration, buat atau modifikasi filter:
    1. Tetapkan parameter filter dalam dialog Create New Logcat Filter:
      • Filter Name: Masukkan nama filter yang ingin Anda tentukan atau pilih filter yang ada di panel kiri untuk memodifikasinya. Nama hanya boleh berisi karakter huruf kecil, garis bawah, dan angka.
      • Log Tag: Opsional, menetapkan tag.
      • Log Message: Opsional, menetapkan teks pesan log.
      • Package Name: Opsional, menetapkan nama paket.
      • PID: Opsional, menetapkan ID proses.
      • Log Level: Opsional, memilih level log.
      • Regex: Pilih opsi ini untuk menggunakan sintaksis ekspresi reguler untuk parameter tersebut.
    2. Klik + untuk menambahkan definisi filter ke panel kiri.

      Untuk menghapus filter, pilih filter di panel kiri dan klik -.

    3. Setelah selesai, klik OK.

Jika Anda tidak melihat pesan log yang diinginkan, pilih No filters dan telusuri pesan log tertentu.

Membaca pesan pembersihan sampah memori

Terkadang saat peristiwa pembersihan sampah memori (GC) terjadi, informasi dicetak ke Logcat.

Untuk detail lebih lanjut tentang memori aplikasi Anda, gunakan Memory Profiler.

Pesan log Dalvik

Pada Dalvik, tetapi tidak pada ART, setiap GC mencetak informasi berikut ke Logcat:

D/dalvikvm(PID): GC_Reason Amount_freed,
Heap_stats, External_memory_stats, Pause_time

Contoh:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

Saat pesan log terakumulasi, waspadai peningkatan statistik heap. Jika nilai ini terus meningkat, Anda mungkin mengalami kebocoran memori.

Istilah berikut disertakan dalam pesan log Dalvik:

Alasan GC
Apa yang memicu GC dan jenis pengumpulannya. Alasan yang mungkin muncul meliputi:
GC_CONCURRENT
GC serentak yang mengosongkan memori saat heap Anda nyaris penuh.
GC_FOR_MALLOC
GC dipicu karena aplikasi Anda mencoba mengalokasikan memori saat heap telah penuh, sehingga sistem harus menghentikan aplikasi dan memperoleh kembali memori.
GC_HPROF_DUMP_HEAP
GC yang terjadi saat Anda meminta pembuatan file HPROF untuk menganalisis heap Anda.
GC_EXPLICIT
GC eksplisit, misalnya saat Anda memanggil gc(). Namun, hindari memanggil metode ini; sebagai gantinya, percayakan GC agar berjalan saat diperlukan.
GC_EXTERNAL_ALLOC
GC untuk memori yang dialokasikan secara eksternal, seperti data piksel yang disimpan dalam memori native atau buffering byte NIO. Ini hanya terjadi pada API level 10 dan yang lebih rendah. Versi yang lebih baru mengalokasikan semua yang ada di heap Dalvik.
Jumlah yang dibebaskan
Jumlah memori yang dapat diperoleh kembali dari GC ini.
Statistik heap
Persentase heap yang dibebaskan dan (jumlah objek aktif)/(total ukuran heap).
Statistik memori eksternal
Memori yang dialokasikan secara eksternal pada API level 10 dan yang lebih rendah: (jumlah memori yang dialokasikan)/(batas terjadinya pembersihan sampah memori).
Waktu jeda
Heap yang lebih besar memiliki waktu jeda yang lebih besar. Waktu jeda serentak menampilkan dua jeda: satu di awal pembersihan dan satu lagi menjelang akhir pembersihan.

Pesan log ART

Tidak seperti Dalvik, ART tidak mencatat log pesan untuk GC yang tidak diminta secara eksplisit. Informasi GC hanya dicetak jika GC eksplisit atau jeda GC melebihi 5 md atau durasi GC melebihi 100 md. Jika aplikasi tidak dalam keadaan jeda yang terasa, seperti saat aplikasi berjalan di latar belakang, saat pengguna tidak dapat merasakan jeda GC, maka tidak ada informasi GC yang dicetak kecuali untuk GC eksplisit.

ART menyertakan informasi berikut dalam pesan log pembersihan sampah memori:

I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects,
    Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

Contoh:

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects,
    21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms

Istilah berikut disertakan dalam pesan log ART:

Alasan GC
Apa yang memicu GC dan jenis pengumpulannya. Alasan yang mungkin muncul meliputi:
Concurrent
GC serentak yang tidak menangguhkan thread aplikasi. GC ini berjalan di thread latar belakang dan tidak mencegah alokasi.
Alloc
GC dimulai karena aplikasi mencoba mengalokasikan memori saat heap sudah penuh. Dalam kasus ini, pembersihan sampah memori terjadi di thread pengalokasi.
Explicit
Pembersihan sampah memori diminta secara eksplisit oleh aplikasi, misalnya dengan memanggil System.gc() atau Runtime.gc(). Namun, seperti halnya Dalvik, praktik terbaik di ART adalah memercayai GC dan menghindari permintaan GC eksplisit, jika memungkinkan. GC eksplisit tidak dianjurkan karena memblokir thread pengalokasi dan memboroskan siklus CPU secara sia-sia. GC eksplisit juga dapat menyebabkan jank (aplikasi tersendat, bergetar, atau terhenti) jika GC itu menyebabkan tertundanya eksekusi thread lain.
NativeAlloc
GC yang disebabkan oleh tekanan memori native dari alokasi native, seperti bitmap atau objek alokasi RenderScript.
CollectorTransition
GC yang disebabkan oleh transisi heap. Hal ini disebabkan oleh perubahan strategi GC saat runtime, seperti saat aplikasi berubah di antara status jeda yang terasa. Transisi pembersih sampah memori meliputi menyalin semua objek dari ruang yang didukung daftar-bebas ke ruang bump pointer atau sebaliknya.

Ini hanya terjadi pada perangkat dengan RAM rendah yang menjalankan versi Android di bawah 8.0 saat aplikasi mengubah status proses dari status yang merasakan jeda, seperti saat aplikasi berada di latar depan, dan pengguna dapat mempersepsikan jeda GC, ke kondisi yang tidak terasa saat jeda, atau sebaliknya.

HomogeneousSpaceCompact
Pemadatan ruang homogen adalah pemadatan ruang daftar-bebas ke ruang daftar-bebas, yang biasanya terjadi saat sebuah aplikasi dipindahkan ke kondisi jeda proses yang tidak terasa. Alasan utama melakukannya adalah untuk mengurangi penggunaan RAM dan mendefragmentasi heap.
DisableMovingGc
Ini bukan alasan GC, melainkan catatan bahwa pembersihan sampah memori diblokir karena adanya penggunaan GetPrimitiveArrayCritical selagi pemadatan heap serentak sedang berlangsung. Secara umum, penggunaan GetPrimitiveArrayCritical sangat tidak dianjurkan karena membatasi pembersih sampah memori yang terus bergerak.
HeapTrim
Ini bukan alasan GC, melainkan catatan bahwa pembersihan sampah memori diblokir hingga pemangkasan heap selesai.
Nama GC
ART memiliki berbagai GC yang menjalankan:
Concurrent mark sweep (CMS)
Pembersih heap keseluruhan yang mengumpulkan semua ruang selain ruang gambar.
Concurrent partial mark sweep
Pembersih heap nyaris keseluruhan yang membersihkan semua ruang selain ruang gambar dan zygote.
Concurrent sticky mark sweep
Pembersih generasional yang hanya dapat membebaskan objek yang dialokasikan sejak GC terakhir. Pembersihan sampah memori ini dijalankan lebih sering dibandingkan mark sweep penuh atau sebagian karena prosesnya lebih cepat dan memiliki jeda lebih sedikit.
Marksweep + semispace
GC penyalin tidak serentak yang digunakan untuk transisi heap serta pemadatan ruang homogen untuk mendefragmentasi heap.
Objects freed
Jumlah objek yang diperoleh kembali melalui GC ini dari ruang objek yang tidak berukuran besar.
Size freed
Jumlah byte yang diperoleh kembali melalui GC ini dari ruang objek yang tidak berukuran besar.
Large objects freed
Jumlah objek dalam ruang objek besar yang diperoleh kembali melalui pembersihan sampah memori ini.
Large object size freed
Jumlah byte dalam ruang objek besar yang diperoleh kembali melalui pembersihan sampah memori ini.
Heap stats
Persentase yang dibebaskan dan (jumlah objek aktif)/(total ukuran heap).
Pause times
Biasanya, waktu jeda berbanding lurus dengan jumlah referensi objek yang diubah selama GC berjalan. Saat ini, GC ART CMS hanya memiliki satu kali jeda, menjelang akhir GC. GC yang terus bergerak memiliki jeda panjang yang berlangsung hampir sepanjang durasi GC.

Jika Anda melihat pesan GC dalam jumlah besar di Logcat, cari peningkatan statistik heap. Jika nilai ini terus meningkat dan tidak ada tanda-tanda berkurang, Anda mungkin mengalami kebocoran memori.

Atau, jika Anda melihat GC yang menentukan alasan "Alloc", Anda sudah beroperasi di dekat kapasitas heap dan akan menerima pengecualian kehabisan memori dalam waktu dekat.