Bagaimana Cara Menulis dan Melihat Log dengan Logcat pada ANDROID STUDIO?
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
. Jendela 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.
Mulai Android Studio 2.2, jendela Run juga menampilkan pesan log untuk aplikasi yang sedang berjalan. Perhatikan bahwa Anda dapat mengonfigurasi tampilan output logcat, tetapi tidak untuk jendela Run.
Melihat log aplikasi Anda
Untuk menampilkan pesan log sebuah aplikasi:
- Buat dan jalankan aplikasi Anda di perangkat.
- Klik View > Tool Windows > Logcat (atau klik Logcat
di panel jendela fitur).
Jendela Logcat menampilkan pesan log untuk aplikasi yang dipilih, seperti yang dipilih dari daftar drop-down di bagian atas jendela, sebagaimana 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:
- Clear logcat
: Klik untuk menghapus log yang terlihat.
- 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.
- Up the stack trace
dan Down the stack trace
: Klik untuk menavigasi pelacakan tumpukan naik dan turun dalam log, yang akan memilih nama file berikutnya (dan melihat nomor baris terkaitnya di editor) yang muncul dalam pengecualian tercetak. Perilaku ini sama dengan ketika Anda mengklik nama file dalam log.
- Use soft wraps
: Klik untuk mengaktifkan penggabungan baris dan mencegah scrolling horizontal (tetapi string yang tidak dapat dipecah tetap memerlukan scrolling horizontal).
- Print
: Klik untuk mencetak pesan logcat. Setelah memilih preferensi cetak dalam dialog yang ditampilkan, Anda juga dapat memilih untuk menyimpannya ke PDF.
- 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.
- Logcat header
: Klik untuk membuka dialog Configure Logcat Header, di mana Anda dapat menyesuaikan tampilan setiap pesan logcat, seperti apakah akan menampilkan tanggal dan waktu atau tidak.
- Screen capture
: Klik untuk mengambil screenshot.
- 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. Biasanya, Anda harus menggunakan metode log berikut, yang diurutkan dari prioritas paling tinggi ke paling rendah (atau dari yang paling tidak verbose ke yang paling verbose):Log.e(String, String)
(error)Log.w(String, String)
(warning/peringatan)Log.i(String, String)
(information/informasi)Log.d(String, String)
(debug)Log.v(String, String)
(verbose)
Lihat deskripsi class
Log
untuk daftar opsi yang lebih lengkap.
Anda tidak boleh mengompilasi log verbose ke dalam aplikasi, kecuali selama pengembangan. Log debug dikompilasi tetapi dihilangkan pada waktu proses, sementara 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 singkat yang menunjukkan komponen sistem dari mana pesan berasal (misalnya
ActivityManager
). Tag Anda dapat berupa string apa pun yang menurut Anda bermanfaat, seperti 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:
Catatan: Nama tag yang lebih dari 23 karakter akan terpotong dalam output logcat.
Format pesan Logcat
Setiap pesan log Android memiliki tag dan prioritas yang terkait dengannya. Tag pesan log sistem adalah string singkat yang menunjukkan komponen sistem dari mana pesan berasal (misalnya
ActivityManager
). Tag yang ditentukan pengguna dapat berupa string apa pun yang menurut Anda bermanfaat, seperti nama class saat ini (tag yang direkomendasikan). Anda menetapkan tag ini dalam panggilan metode Log
, misalnya:
Prioritasnya adalah salah satu dari nilai berikut:
- V: Verbose (prioritas terendah)
- D: Debug
- I: Info
- W: Warning
- E: Error
- A: Assert
Format pesan log adalah:
date time PID-TID/package priority/tag: message
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.
PID singkatan dari process identifier (ID proses) dan TID adalah singkatan dari thread identifier (ID thread); keduanya bisa sama jika hanya ada satu thread.
Menetapkan level log
Anda dapat mengontrol banyaknya pesan yang ditampilkan di logcat dengan menetapkan level log. Anda dapat menampilkan semua pesan, atau hanya pesan yang menunjukkan kondisi paling parah.
Ingat bahwa logcat terus mengumpulkan semua pesan terlepas dari setelan level log Anda. 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 level pesan yang lebih rendah dalam daftar ini.
- Assert: Menampilkan masalah yang kejadiannya tidak pernah diharapkan oleh developer.
Menelusuri pesan logcat
Untuk menelusuri pesan yang saat ini ditampilkan di logcat:
- Atau, pilih Regex jika Anda ingin menggunakan pola penelusuran ekspresi reguler.
- Ketikkan rangkaian karakter dalam kolom penelusuran
.
Tampilan output logcat berubah sesuai penelusuran Anda. - Tekan Enter untuk menyimpan string penelusuran di menu selama sesi.
- Untuk mengulangi penelusuran, pilih string dari menu penelusuran. Pilih atau batalkan pilih Regex sesuai yang diperlukan (setelan ini tidak diingat).
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:
- 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. - Jika Anda memilih Edit Filter Configuration, buat atau modifikasi filter:
- Tetapkan parameter filter dalam dialog Create New Logcat Filter:
- Filter Name: Ketik nama filter yang ingin Anda tetapkan, atau pilih di panel kiri untuk memodifikasi filter yang ada. Nama filter hanya boleh berisi karakter huruf kecil, garis bawah, dan angka.
- Log Tag: Opsional, menetapkan tag. Untuk informasi selengkapnya, lihat Format Pesan logcat.
- Log Message: Opsional, menetapkan teks pesan log. Untuk informasi selengkapnya, lihat Format Pesan logcat.
- Package Name: Opsional, menetapkan nama paket. Untuk informasi selengkapnya, lihat Format Pesan logcat.
- PID: Opsional, menetapkan ID proses. Untuk informasi selengkapnya, lihat Format Pesan logcat.
- Log Level: Opsional, memilih level log. Untuk informasi selengkapnya, lihat Menetapkan Level Log.
- Regex: Pilih opsi ini untuk menggunakan sintaks ekspresi reguler untuk parameter tersebut.
- Klik + untuk menambahkan definisi filter ke panel kiri.Untuk menghapus filter, pilih filter di panel kiri dan klik -.
- Setelah selesai, klik OK.
- Tetapkan parameter filter dalam dialog Create New Logcat Filter:
Jika Anda tidak melihat pesan log yang diinginkan, cobalah memilih No filters dan lakukan penelusuran pesan log tertentu.
Membaca pesan pembersihan sampah memori
Kadang-kadang, saat pembersihan sampah memori terjadi, peristiwa tersebut 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
- Alasan GC
- Apa yang memicu GC dan pembersihan sampah memori jenis apa itu. 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()
(yang seharusnya tidak Anda panggil dan sebagai gantinya mempercayai GC untuk dijalankan jika diperlukan). GC_EXTERNAL_ALLOC
- Ini hanya terjadi pada API level 10 dan yang lebih rendah (versi yang lebih baru mengalokasikan semuanya pada heap Dalvik). GC untuk memori yang dialokasikan secara eksternal (seperti data piksel yang disimpan dalam memori native atau buffer byte NIO).
- Jumlah yang dibebaskan
- Banyaknya 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 akan memiliki waktu jeda lebih banyak. Waktu jeda serentak menampilkan dua jeda: satu di awal pembersihan dan satu lagi menjelang akhir pembersihan.
Saat pesan log ini terkumpul, waspadai peningkatan statistik heap (nilai
3571K/9991K
dalam contoh di atas). Jika nilai ini terus meningkat, Anda mungkin mengalami kebocoran memori.Pesan log ART
Tidak seperti Dalvik, ART tidak mencatat log pesan untuk GC yang tidak diminta secara eksplisit. GC hanya dicetak jika dianggap lambat. Lebih tepatnya, GC dicetak hanya jika jeda GC melebihi 5 milidetik atau durasi GC melebihi 100 milidetik. Jika aplikasi tidak dalam kondisi jeda yang terasa (misalnya saat aplikasi berjalan di latar belakang, di mana pengguna tidak dapat merasakan jeda GC), maka tidak ada GC yang dianggap lambat. GC eksplisit selalu dicatat ke log.
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
- Alasan GC
- Apa yang memicu GC dan pembersihan sampah memori jenis apa itu. 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 ini dimulai karena aplikasi Anda 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
gc()
ataugc()
. Seperti pada Dalvik, praktik terbaik pada ART adalah dengan memercayai GC dan menghindari permintaan GC eksplisit, jika memungkinkan. GC eksplisit tidak dianjurkan karena memblokir thread pengalokasi dan memboroskan putaran CPU secara sia-sia. GC eksplisit juga dapat menyebabkan jank (aplikasi tersendat, bergetar, atau terhenti) jika GC itu menyebabkan tertundanya eksekusi thread lain. NativeAlloc
- Pembersihan sampah memori disebabkan oleh tekanan memori native dari alokasi native seperti objek alokasi Bitmap atau RenderScript.
CollectorTransition
- Pembersihan sampah memori disebabkan oleh transisi heap; peristiwa ini disebabkan oleh berubahnya strategi GC pada waktu proses (misalnya saat aplikasi beralih 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 sebelum Android 8.0 saat aplikasi mengubah status proses dari kondisi jeda yang terasa (misalnya saat aplikasi berjalan di latar depan, di mana pengguna dapat merasakan jeda GC) ke kondisi jeda yang tidak terasa (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 yang sebenarnya, 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 beragam GC yang dapat dijalankan.
Concurrent mark sweep (CMS)
- Pembersih heap keseluruhan yang membersihkan 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).
- Objek yang dibebaskan
- Jumlah objek yang diperoleh kembali melalui GC ini dari ruang objek yang tidak berukuran besar.
- Ukuran yang dibebaskan
- Jumlah byte yang diperoleh kembali melalui GC ini dari ruang objek yang tidak berukuran besar.
- Objek besar yang dibebaskan
- Jumlah objek dalam ruang objek besar yang diperoleh kembali melalui pembersihan sampah memori ini.
- Ukuran objek besar yang dibebaskan
- Jumlah byte dalam ruang objek besar yang diperoleh kembali melalui pembersihan sampah memori ini.
- Statistik heap
- Persentase yang dibebaskan dan (jumlah objek aktif)/(total ukuran heap).
- Waktu jeda
- 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 GC yang banyak sekali pada logcat, waspadai kenaikan statistik heap (nilai
25MB/38MB
dalam contoh di atas). Jika nilai ini terus meningkat dan tidak ada tanda-tanda berkurang, Anda mungkin mengalami kebocoran memori. Atau, jika Anda melihat GC karena alasan "Alloc", berarti Anda sudah beroperasi mendekati kapasitas heap dan akan menerima pengecualian OOM dalam waktu dekat.
Komentar
Posting Komentar