Wenn logcat die Länge auf 1000 begrenzt, können Sie die zu protokollierende Zeichenfolge mit String.subString () teilen und in Teilen protokollieren. Beispielsweise:
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));}
Log Cat druckt nur die Hälfte der Antwort. Wie kann ich die Länge der gesamten Antwort ermitteln? Sie sagten, dass sehr LongString.length (), aber hier ist es nur die Hälfte der Antwort gedruckt, wenn ich das JSON-Ergebnis in Log Cat
drucke
Aber in der iPhone-Konsole bekomme ich die gesamte Antwortzeichenfolge
Vasu
Sie können die Länge der Antwort überprüfen, indem Sie length () in das Protokoll schreiben. Wenn dieser Wert nicht Ihren Erwartungen entspricht, liegt das Problem möglicherweise nicht bei der Protokollierung.
Spatulamania
3
Ich kann nicht glauben, dass Android es so schwer macht!
Alston
1
Ich denke, dieser Code protokolliert am Ende einen zusätzlichen, leeren Protokolleintrag, wenn veryLongString.length()es sich um ein Vielfaches von handelt maxLogSize. Vielleicht ändern Sie das <=zu <.
LarsH
29
Als Folge der Antwort von Spatulamania habe ich eine Wrapper-Klasse geschrieben, die dies für Sie erledigt. Sie müssen nur den Import ändern und es wird alles protokolliert
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));}}}
Vielen Dank. Mehr als 3000 Symbole werden nicht empfohlen, ich benutze sie.
CoolMind
9
So macht es OkHttp mit 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 ist 4000.
Hier wird Log.d (Debug) und das fest codierte "OkHttp" -Tag verwendet.
Das Protokoll wird bei Zeilenumbrüchen oder bei Erreichen der maximalen Länge aufgeteilt.
Diese Klasse unten ist eine Hilfsklasse, die Sie verwenden können (wenn Sie Lambda-Unterstützung haben, werfen Sie Jack & Jill oder Retrolambda), um dasselbe zu tun, was OkHttp in jedem Protokoll tut:
/**
* 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);}}
Wenn eine einfache Schleife ausreicht, warum dann Rekursion verwenden?
Pellucide
3
Ich bin ein Fan von Rekursion, da ich die Lesbarkeit und Wiederverwendung von Code großartig finde. Diese Tail-End-Rekursion kann jedoch schnell Stack-Frames aufbauen, wenn Ihr Compiler sie nicht optimiert (was meiner Meinung nach im Android Studio nicht der Fall ist). Dies bedeutet, dass Sie einen StackOverflowError erstellen können, wenn Sie eine sehr lange Nachricht haben, die eine Vielzahl rekursiver Aufrufe verursacht.
Luke
3
Um die Aufteilung der Zeilen auf Protokollnachrichten nicht zu minimieren, nehme ich die große Zeichenfolge und protokolliere jede Zeile separat.
Antworten:
Wenn logcat die Länge auf 1000 begrenzt, können Sie die zu protokollierende Zeichenfolge mit String.subString () teilen und in Teilen protokollieren. Beispielsweise:
quelle
veryLongString.length()
es sich um ein Vielfaches von handeltmaxLogSize
. Vielleicht ändern Sie das<=
zu<
.Als Folge der Antwort von Spatulamania habe ich eine Wrapper-Klasse geschrieben, die dies für Sie erledigt. Sie müssen nur den Import ändern und es wird alles protokolliert
quelle
Dies baut auf der Antwort von Spatulamania auf, ist etwas prägnanter und fügt am Ende keine leere Protokollnachricht hinzu:
quelle
So macht es OkHttp mit HttpLoggingInterceptor:
MAX_LOG_LENGTH
ist 4000.Hier wird Log.d (Debug) und das fest codierte "OkHttp" -Tag verwendet.
Das Protokoll wird bei Zeilenumbrüchen oder bei Erreichen der maximalen Länge aufgeteilt.
Diese Klasse unten ist eine Hilfsklasse, die Sie verwenden können (wenn Sie Lambda-Unterstützung haben, werfen Sie Jack & Jill oder Retrolambda), um dasselbe zu tun, was OkHttp in jedem Protokoll tut:
quelle
Versuchen Sie diesen Code, um eine lange Nachricht in logcat anzuzeigen.
quelle
Um die Aufteilung der Zeilen auf Protokollnachrichten nicht zu minimieren, nehme ich die große Zeichenfolge und protokolliere jede Zeile separat.
quelle
Hier ist eine Kotlin-Version für die Antwort von @spatulamania (insbesondere für faule / kluge Leute):
quelle
Ich halte Timber für eine gute Option für dieses Problem. Timber teilt und druckt automatisch Nachrichtenblöcke in logcat.
https://github.com/JakeWharton/timber
Sie können die Implementierung der Protokollmethode in der statischen Klasse timber.log.Timber.DebugTree sehen.
quelle
Wenn Sie eine JSON-Zeichenfolge drucken, können Sie den folgenden Code verwenden
vollständiger Code
quelle
Verwenden Sie für eine einfache Lösung die Option " Soft Wrap verwenden " unter den Optionen "Anhängepunkt Nr. 4".
quelle