Если logcat ограничивает длину 1000, вы можете разделить строку, которую хотите зарегистрировать, с помощью String.subString () и записать ее по частям. Например:
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));}
Журнал кота печатает только половину ответа ... как я могу получить длину всего ответа. вы сказали, что veryLongString.length (), но здесь он напечатал только половину ответа, когда я печатаю результат json в журнале cat
Vasu
Но в консоли iphone я получаю всю строку ответа
Васу
вы можете проверить длину ответа, записав length () в журнал. Если это значение не соответствует вашим ожиданиям, возможно, проблема не в ведении журнала.
spatulamania
3
Не могу поверить, что Android так усложняет задачу!
Alston
1
Я думаю, что этот код будет регистрировать дополнительную пустую запись в конце, если veryLongString.length()она кратна maxLogSize. Может быть , изменить <=к <.
LarsH 06
29
В качестве продолжения ответа на spatulamania я написал класс-оболочку, который обрабатывает это за вас. Вам просто нужно изменить импорт, и он будет регистрировать все
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));}}}
Спасибо. Больше 3000 символов не рекомендуется, я так использую.
CoolMind
9
Вот как это делает OkHttp с HttpLoggingInterceptor:
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 составляет 4000.
Здесь используется Log.d (отладка) и жестко запрограммированный тег OkHttp.
Он разбивает журнал по символам новой строки или по достижении максимальной длины.
Этот класс ниже является вспомогательным классом, который вы можете использовать (если у вас есть поддержка лямбда, throw Jack & Jill или retrolambda), чтобы делать то же самое, что OkHttp делает в любом журнале:
/**
* 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);}}
когда будет достаточно простого цикла, зачем использовать рекурсию.
pellucide
3
Я поклонник рекурсии, так как считаю удобство и повторное использование кода отличными. Однако эта хвостовая рекурсия может быстро создавать кадры стека, если ваш компилятор не оптимизирует их (что я не верю, что это делает студия Android). Это означает, что если у вас есть достаточно длинное сообщение, которое вызывает множество рекурсивных вызовов, вы можете легко создать StackOverflowError.
Люк
3
Чтобы не минимизировать разделение строк в сообщениях журнала, я беру большую строку и записываю каждую строку отдельно.
Ответы:
Если logcat ограничивает длину 1000, вы можете разделить строку, которую хотите зарегистрировать, с помощью String.subString () и записать ее по частям. Например:
источник
veryLongString.length()
она кратнаmaxLogSize
. Может быть , изменить<=
к<
.В качестве продолжения ответа на spatulamania я написал класс-оболочку, который обрабатывает это за вас. Вам просто нужно изменить импорт, и он будет регистрировать все
источник
Это основано на ответе spatulamania, немного более сжато и не добавит пустое сообщение журнала в конце:
источник
Вот как это делает OkHttp с HttpLoggingInterceptor:
MAX_LOG_LENGTH
составляет 4000.Здесь используется Log.d (отладка) и жестко запрограммированный тег OkHttp.
Он разбивает журнал по символам новой строки или по достижении максимальной длины.
Этот класс ниже является вспомогательным классом, который вы можете использовать (если у вас есть поддержка лямбда, throw Jack & Jill или retrolambda), чтобы делать то же самое, что OkHttp делает в любом журнале:
источник
Попробуйте этот фрагмент кода, чтобы показать длинное сообщение в logcat.
источник
Чтобы не минимизировать разделение строк в сообщениях журнала, я беру большую строку и записываю каждую строку отдельно.
источник
Вот версия Котлина для ответа @spatulamania (особенно для ленивых / умных людей):
источник
Считаю Timber хорошим вариантом для решения этого вопроса. Timber автоматически разделяет и печатает куски сообщения в logcat.
https://github.com/JakeWharton/timber
Вы можете увидеть реализацию метода журнала в статическом классе timber.log.Timber.DebugTree.
источник
если напечатать строку json, можно использовать код ниже
полный код
источник
Для простого решения используйте параметр « Использовать мягкую пленку» в пункте 4 ниже, могут вам помочь.
источник