Se o logcat está limitando o comprimento em 1000, você pode dividir a string que deseja registrar com String.subString () e registrá-la em partes. Por exemplo:
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 imprimindo apenas metade da resposta .. como eu poderia obter o comprimento de toda a resposta. você disse that veryLongString.length () mas aqui é impresso apenas metade da resposta quando eu imprimo o resultado json no log cat
Vasu
Mas no console do iphone estou recebendo toda a string de resposta
Vasu
você pode verificar o comprimento da resposta escrevendo length () no log. Se esse valor não for o que você esperava, o problema pode não ser com o registro.
Spatulamania
3
Não acredito que o Android torna isso tão difícil!
Alston
1
Acho que este código registrará uma entrada de log extra vazia no final, se veryLongString.length()for um múltiplo de maxLogSize. Talvez mude o <=para <.
LarsH
29
Seguindo a resposta da espátulamania, escrevi uma classe de invólucro que trata disso para você. Você só precisa alterar a importação e ele irá registrar tudo
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));}}}
Obrigado. Mais de 3000 símbolos não é recomendado, eu uso isso.
CoolMind de
9
É assim que OkHttp com HttpLoggingInterceptor faz:
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.
Aqui, ele usa Log.d (depuração) e a tag "OkHttp" codificada.
Ele divide o log em novas linhas ou quando atinge o comprimento máximo.
A classe abaixo é uma classe auxiliar que você pode usar (se tiver suporte a lambda como Jack & Jill ou retrolambda) para fazer a mesma coisa que OkHttp faz em qualquer log:
/**
* 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);}}
quando um simples loop for suficiente, por que usar recursão.
pelucida de
3
Eu sou um fã de recursividade, pois considero a legibilidade e a reutilização de código excelentes. No entanto, essa recursão final pode construir stack frames rapidamente se seu compilador não otimizá-los (o que eu não acredito que o Android Studio faça). Isso significa que se você tiver uma mensagem substancialmente longa que causa um pluribus de chamadas recursivas, você pode criar facilmente um StackOverflowError.
Lucas
3
Para não minimizar a divisão de linhas nas mensagens de log, pego a grande string e registro cada linha separadamente.
Respostas:
Se o logcat está limitando o comprimento em 1000, você pode dividir a string que deseja registrar com String.subString () e registrá-la em partes. Por exemplo:
fonte
veryLongString.length()
for um múltiplo demaxLogSize
. Talvez mude o<=
para<
.Seguindo a resposta da espátulamania, escrevi uma classe de invólucro que trata disso para você. Você só precisa alterar a importação e ele irá registrar tudo
fonte
Isso se baseia na resposta da espátulamania, é um pouco mais sucinto e não adicionará uma mensagem de registro vazia no final:
fonte
É assim que OkHttp com HttpLoggingInterceptor faz:
MAX_LOG_LENGTH
é 4000.Aqui, ele usa Log.d (depuração) e a tag "OkHttp" codificada.
Ele divide o log em novas linhas ou quando atinge o comprimento máximo.
A classe abaixo é uma classe auxiliar que você pode usar (se tiver suporte a lambda como Jack & Jill ou retrolambda) para fazer a mesma coisa que OkHttp faz em qualquer log:
fonte
Experimente este pedaço de código para mostrar mensagens longas no logcat.
fonte
Para não minimizar a divisão de linhas nas mensagens de log, pego a grande string e registro cada linha separadamente.
fonte
Aqui está uma versão Kotlin para a resposta @spatulamania (especialmente para pessoas preguiçosas / espertas):
fonte
Considero a madeira uma boa opção para esse problema. A madeira divide e imprime blocos de mensagem automaticamente no logcat.
https://github.com/JakeWharton/timber
Você pode ver a implementação do método de log na classe estática Timber.log.Timber.DebugTree.
fonte
se imprimir string json, pode usar o código abaixo
código completo
fonte
Para uma solução fácil, use a opção Use soft wrap no ponto de conexão nº 4 abaixo. As opções podem ajudá-lo.
fonte