Jika logcat membatasi panjangnya pada 1000 maka Anda dapat membagi string yang ingin Anda catat dengan String.subString () dan memasukkannya dalam beberapa bagian. Sebagai contoh:
int maxLogSize =1000;for(int i =0; i <= veryLongString.length()/ maxLogSize; i++){int start = i * maxLogSize;intend=(i+1)* maxLogSize;end=end> veryLongString.length()? veryLongString.length():end;Log.v(TAG, veryLongString.substring(start,end));}
Pencetakan log cat hanya setengah dari respon .. bagaimana saya bisa mendapatkan panjang dari keseluruhan respon. Anda mengatakan bahwa veryLongString.length () tetapi di sini dicetak hanya setengah dari respons ketika saya mencetak hasil json di log cat
Vasu
Tetapi di konsol iphone saya mendapatkan seluruh rangkaian respons
Vasu
Anda bisa memeriksa panjang respon dengan menulis length () ke log. Jika nilai ini tidak seperti yang Anda harapkan, masalahnya mungkin bukan pada logging.
spatulamania
3
Tidak percaya Android membuatnya begitu sulit!
Alston
1
Saya pikir kode ini akan mencatat entri log tambahan yang kosong di bagian akhir, jika veryLongString.length()merupakan kelipatan maxLogSize. Mungkin ubah <=menjadi <.
LarsH
29
Sebagai tindak lanjut dari jawaban spatulamania saya menulis kelas pembungkus yang menangani ini untuk Anda. Anda hanya perlu mengubah impor dan itu akan mencatat semuanya
publicclassLog{publicstaticvoid d(String TAG,String message){int maxLogSize =2000;for(int i =0; i <= message.length()/ maxLogSize; i++){int start = i * maxLogSize;intend=(i+1)* maxLogSize;end=end> message.length()? message.length():end;
android.util.Log.d(TAG, message.substring(start,end));}}}
Terima kasih. Lebih dari 3000 simbol tidak disarankan, saya menggunakannya.
CoolMind
9
Beginilah cara OkHttp dengan HttpLoggingInterceptor melakukannya:
publicvoid log(String message){// Split by line, then ensure each line can fit into Log's maximum length.for(int i =0, length = message.length(); i < length; i++){int newline = message.indexOf('\n', i);
newline = newline !=-1? newline : length;do{intend=Math.min(newline, i + MAX_LOG_LENGTH);Log.d("OkHttp", message.substring(i,end));
i =end;}while(i < newline);}}
MAX_LOG_LENGTH adalah 4000.
Di sini ia menggunakan Log.d (debug) dan tag "OkHttp" yang di-hardcode.
Ini membagi log di baris baru atau saat mencapai panjang maksimal.
Kelas di bawah ini adalah kelas pembantu yang dapat Anda gunakan (jika Anda memiliki dukungan lambda, lemparkan Jack & Jill atau retrolambda) untuk melakukan hal yang sama yang dilakukan OkHttp pada log mana pun:
/**
* Help printing logs splitting text on new line and creating multiple logs for too long texts
*/publicclassLogHelper{privatestaticfinalint MAX_LOG_LENGTH =4000;publicstaticvoid v(@NonNullString tag,@NullableString message){
log(message, line ->Log.v(tag, line));}publicstaticvoid d(@NonNullString tag,@NullableString message){
log(message, line ->Log.d(tag, line));}publicstaticvoid i(@NonNullString tag,@NullableString message){
log(message, line ->Log.i(tag, line));}publicstaticvoid w(@NonNullString tag,@NullableString message){
log(message, line ->Log.w(tag, line));}publicstaticvoid e(@NonNullString tag,@NullableString message){
log(message, line ->Log.e(tag, line));}publicstaticvoid v(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.v(tag, line));}publicstaticvoid d(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.d(tag, line));}publicstaticvoid i(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.i(tag, line));}publicstaticvoid w(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.w(tag, line));}publicstaticvoid e(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.e(tag, line));}privatestaticvoid log(@NullableString message,@NonNullLogCB callback){if(message ==null){
callback.log("null");return;}// Split by line, then ensure each line can fit into Log's maximum length.for(int i =0, length = message.length(); i < length; i++){int newline = message.indexOf('\n', i);
newline = newline !=-1? newline : length;do{intend=Math.min(newline, i + MAX_LOG_LENGTH);
callback.log(message.substring(i,end));
i =end;}while(i < newline);}}privatestaticvoid log(@NullableString message,@NullableThrowable throwable,@NonNullLogCB callback){if(throwable ==null){
log(message, callback);return;}if(message !=null){
log(message +"\n"+Log.getStackTraceString(throwable), callback);}else{
log(Log.getStackTraceString(throwable), callback);}}privateinterfaceLogCB{void log(@NonNullString message);}}
ketika loop sederhana sudah cukup, mengapa menggunakan rekursi.
pellucide
3
Saya penggemar rekursi karena menurut saya kesiapan dan penggunaan kembali kode itu bagus. Namun rekursi ujung ekor ini dapat membangun tumpukan frame dengan cepat jika kompiler Anda tidak mengoptimalkannya (yang saya tidak percaya studio Android melakukannya). Ini berarti bahwa jika Anda memiliki pesan yang sangat panjang yang menyebabkan banyaknya panggilan rekursif, Anda dapat dengan mudah membuat StackOverflowError.
Lukas
3
Agar tidak meminimalkan garis pemisahan di seluruh pesan log, saya mengambil string besar dan mencatat setiap baris secara terpisah.
Jawaban:
Jika logcat membatasi panjangnya pada 1000 maka Anda dapat membagi string yang ingin Anda catat dengan String.subString () dan memasukkannya dalam beberapa bagian. Sebagai contoh:
sumber
veryLongString.length()
merupakan kelipatanmaxLogSize
. Mungkin ubah<=
menjadi<
.Sebagai tindak lanjut dari jawaban spatulamania saya menulis kelas pembungkus yang menangani ini untuk Anda. Anda hanya perlu mengubah impor dan itu akan mencatat semuanya
sumber
Ini dibangun berdasarkan jawaban spatulamania, sedikit lebih ringkas, dan tidak akan menambahkan pesan log kosong di akhir:
sumber
Beginilah cara OkHttp dengan HttpLoggingInterceptor melakukannya:
MAX_LOG_LENGTH
adalah 4000.Di sini ia menggunakan Log.d (debug) dan tag "OkHttp" yang di-hardcode.
Ini membagi log di baris baru atau saat mencapai panjang maksimal.
Kelas di bawah ini adalah kelas pembantu yang dapat Anda gunakan (jika Anda memiliki dukungan lambda, lemparkan Jack & Jill atau retrolambda) untuk melakukan hal yang sama yang dilakukan OkHttp pada log mana pun:
sumber
Coba bagian kode ini untuk menampilkan pesan panjang di logcat.
sumber
Agar tidak meminimalkan garis pemisahan di seluruh pesan log, saya mengambil string besar dan mencatat setiap baris secara terpisah.
sumber
Berikut adalah versi Kotlin untuk jawaban @spatulamania (terutama untuk orang yang malas / pintar):
sumber
Saya menganggap Kayu sebagai pilihan yang baik untuk masalah ini. Timber secara otomatis membagi dan mencetak potongan pesan di logcat.
https://github.com/JakeWharton/timber
Anda dapat melihat implementasi metode log di kelas statis timber.log.Timber.DebugTree.
sumber
Jika print json string, bisa menggunakan kode di bawah ini
kode lengkap
sumber
Untuk solusi yang mudah, gunakan opsi Gunakan bungkus lembut di bawah lampirkan poin no 4 opsi mungkin membantu Anda.
sumber