Jeśli logcat ogranicza długość do 1000, możesz podzielić ciąg, który chcesz zarejestrować, za pomocą metody String.subString () i zarejestrować go na części. Na przykład:
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 drukuje tylko połowę odpowiedzi .. jak mogę uzyskać długość całej odpowiedzi. powiedziałeś, że veryLongString.length (), ale tutaj jest drukowana tylko połowa odpowiedzi, gdy drukuję wynik json w log cat
Vasu
Ale w konsoli iPhone'a otrzymuję cały ciąg odpowiedzi
Vasu,
możesz sprawdzić długość odpowiedzi wpisując długość () do dziennika. Jeśli ta wartość nie jest zgodna z oczekiwaniami, problem może nie dotyczyć rejestrowania.
spatulamania
3
Nie mogę uwierzyć, że Android sprawia, że jest to takie trudne!
Alston
1
Myślę, że ten kod zarejestruje dodatkowy, pusty wpis dziennika na końcu, jeśli veryLongString.length()jest wielokrotnością maxLogSize. Może zmienić <=się <.
LarsH
29
W następstwie odpowiedzi na spatulamania napisałem klasę opakowującą, która zajmie się tym za Ciebie. Wystarczy zmienić import, a wszystko zostanie zarejestrowane
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));}}}
Dzięki. Nie polecam więcej niż 3000 symboli, ja używam tak.
CoolMind
9
Oto jak robi to OkHttp z 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 wynosi 4000.
Tutaj używa Log.d (debug) i zakodowanego na stałe tagu „OkHttp”.
Dzieli kłodę w nowej linii lub gdy osiągnie maksymalną długość.
Poniższa klasa jest klasą pomocniczą, której możesz użyć (jeśli masz obsługę lambda, rzut Jack & Jill lub retrolambda), aby zrobić to samo, co OkHttp robi na dowolnym dzienniku:
/**
* 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);}}
kiedy prosta pętla będzie wystarczająca, po co używać rekurencji.
pellucide
3
Jestem fanem rekurencji, ponieważ uważam, że gotowość i ponowne użycie kodu jest świetne. Jednak ta rekurencja na końcu końca może szybko tworzyć ramki stosu, jeśli Twój kompilator ich nie optymalizuje (co, jak sądzę, nie jest w studio Android). Oznacza to, że jeśli masz zasadniczo długą wiadomość, która powoduje wiele wywołań rekurencyjnych, możesz łatwo utworzyć StackOverflowError.
Łukasz
3
Aby nie zminimalizować podziału wierszy na komunikaty dziennika, biorę duży ciąg i rejestruję każdy wiersz oddzielnie.
Odpowiedzi:
Jeśli logcat ogranicza długość do 1000, możesz podzielić ciąg, który chcesz zarejestrować, za pomocą metody String.subString () i zarejestrować go na części. Na przykład:
źródło
veryLongString.length()
jest wielokrotnościąmaxLogSize
. Może zmienić<=
się<
.W następstwie odpowiedzi na spatulamania napisałem klasę opakowującą, która zajmie się tym za Ciebie. Wystarczy zmienić import, a wszystko zostanie zarejestrowane
źródło
To opiera się na odpowiedzi spatulamania, jest trochę bardziej zwięzłe i nie dodaje pustego komunikatu dziennika na końcu:
źródło
Oto jak robi to OkHttp z HttpLoggingInterceptor:
MAX_LOG_LENGTH
wynosi 4000.Tutaj używa Log.d (debug) i zakodowanego na stałe tagu „OkHttp”.
Dzieli kłodę w nowej linii lub gdy osiągnie maksymalną długość.
Poniższa klasa jest klasą pomocniczą, której możesz użyć (jeśli masz obsługę lambda, rzut Jack & Jill lub retrolambda), aby zrobić to samo, co OkHttp robi na dowolnym dzienniku:
źródło
Wypróbuj ten fragment kodu, aby wyświetlić długi komunikat w logcat.
źródło
Aby nie zminimalizować podziału wierszy na komunikaty dziennika, biorę duży ciąg i rejestruję każdy wiersz oddzielnie.
źródło
Oto wersja Kotlin dla odpowiedzi @spatulamania (szczególnie dla leniwych / inteligentnych ludzi):
źródło
Uważam, że Timber jest dobrym rozwiązaniem w tym przypadku. Timber automatycznie dzieli i drukuje fragmenty wiadomości w logcat.
https://github.com/JakeWharton/timber
Implementację metody dziennika można zobaczyć w klasie statycznej timber.log.Timber.DebugTree.
źródło
jeśli drukuje ciąg json, można użyć poniższego kodu
pełny kod
źródło
Aby uzyskać łatwe rozwiązanie, użyj opcji Użyj miękkiego zawijania w poniższym punkcie mocowania nr 4 opcje mogą ci pomóc.
źródło