Secara default, tampaknya logcat akan memotong pesan log yang dianggap "terlalu panjang". Ini terjadi baik di dalam Eclipse maupun saat menjalankan logcat pada baris perintah menggunakan adb -d logcat
, dan memotong beberapa pesan debug penting.
Apakah ada cara untuk menambah panjang string maksimum yang didukung oleh logcat untuk menghentikan pemotongan informasi debug? The dokumentasi resmi menunjukkan bahwa mungkin tidak ada, tapi mungkin logcat mendukung beberapa opsi tambahan yang tidak disebutkan di sana?
Jawaban:
Ada buffer ukuran tetap di logcat untuk log biner (
/dev/log/events
) dan batasnya adalah 1.024 byte. Untuk log non-biner juga ada batasan:Jadi ukuran pesan sebenarnya untuk log biner dan non-biner adalah ~ 4076 byte. Antarmuka logger kernel memberlakukan
LOGGER_ENTRY_MAX_PAYLOAD
batas ini .Sumber liblog (digunakan oleh logcat) juga menyatakan:
Saya akan merekomendasikan Anda alat nxlog yang tidak menggunakan biner logcat, tetapi karena keterbatasan di kernel saya ragu itu akan menyelesaikan masalah Anda. Namun demikian, ini mungkin patut dicoba. (penafian: Saya penulisnya.)
sumber
LOGGER_ENTRY_MAX_PAYLOAD
telah dikurangi dari 4076 menjadi 4068 di versi Android yang lebih baru (lihat di sini ).Oke, menarik. Saya kecewa melihat jawabannya adalah "Anda tidak dapat benar-benar mengembangkannya". Pikiran awal saya adalah memecahnya sehingga saya dapat melihat semuanya, jadi di sini saya berbagi dengan Anda bagaimana saya melakukan hal itu (bukan sesuatu yang mewah atau hampir efisien, tetapi itu menyelesaikan pekerjaan dalam keadaan darurat):
Diedit untuk menampilkan string terakhir!
sumber
int chunkCount = sb.length() / 4000;
Useint chunkCount = sb.length() / 4000; if (chunkCount * 4000 < sb.length()) chunkCount++;
else { Log.v(TAG, sb); }
juga untuk mencetak log ketika pesan <= 4000 karakterPecah menjadi beberapa bagian secara rekursif.
sumber
sumber
Berikut adalah kode yang saya gunakan - memotong garis pada batas 4000 sementara juga memutus garis pada baris baru daripada di tengah-tengah baris. Membuat file log lebih mudah dibaca.
Pemakaian:
Penerapan:
sumber
Kode di bawah ini merupakan penyempurnaan dari apa yang telah diposting oleh Mark Buikema. Ini mematahkan string di baris baru. Berguna untuk mencatat string JSON yang panjang.
sumber
sumber
kami logika paging ini
sumber
memberikan pendapat saya sendiri tentang solusi Travis,
memanfaatkan fakta yang
Log.println()
mengembalikan jumlah byte yang ditulis untuk menghindari hardcode "4000". kemudian, secara rekursif menyebut diri Anda pada bagian pesan yang tidak dapat dicatat hingga tidak ada yang tersisa.sumber
Jika log Anda sangat panjang (mis. Logging seluruh dump database Anda untuk alasan debugging dll.) Mungkin terjadi bahwa logcat mencegah logging yang berlebihan. Untuk menyiasatinya, Anda dapat menambahkan waktu tunggu evry x milidetik.
Hati-hati, gunakan ini hanya untuk tujuan debugging karena dapat menghentikan blokir utas utama.
sumber
Seperti yang disebutkan @mhsmith,
LOGGER_ENTRY_MAX_PAYLOAD
adalah 4068 di versi Android terbaru. Namun, jika Anda menggunakan 4068 sebagai panjang pesan maksimal dalam potongan kode yang ditawarkan di jawaban lain, pesan tersebut akan dipotong. Ini karena Android menambahkan lebih banyak karakter ke awal dan akhir pesan Anda, yang juga dihitung. Jawaban lain menggunakan batas 4000 sebagai solusi. Namun, dimungkinkan untuk benar-benar menggunakan seluruh batas dengan kode ini (kode menghasilkan tag dari pelacakan tumpukan untuk menunjukkan nama kelas dan nomor baris yang disebut log, silakan mengubahnya):sumber
Saya tidak tahu opsi apa pun untuk menambah panjang logcat, tetapi kami dapat menemukan log yang berbeda seperti log utama, log peristiwa, dll. Log utama biasanya berisi semua yang panjangnya mencapai 4 MB .. Jadi, Anda mungkin bisa mendapatkan apa yang hilang di terminal log. Jalurnya adalah: \ data \ logger.
sumber
Meskipun solusi lain yang disediakan sangat membantu, saya tidak puas karena mereka tidak mencakup kasus ketika log lebih panjang dari dua kali lebih panjang dari LOGGER_ENTRY_MAX_LEN yang disebutkan oleh @ b0ti. Lebih lanjut, bahkan solusi saya berikut ini tidak sempurna karena LOGGER_ENTRY_MAX_LEN tidak diambil secara dinamis. Jika seseorang tahu cara untuk melakukan ini, saya akan senang mendengarnya di komentar! Bagaimanapun, ini adalah solusi yang saya gunakan dalam kode saya sekarang:
sumber