Por padrão, parece que o logcat truncará qualquer mensagem de log que considerar "muito longa". Isso acontece tanto dentro do Eclipse quanto ao executar o logcat na linha de comando usandoadb -d logcat
e está truncando algumas mensagens de depuração importantes.
Existe alguma maneira de aumentar o comprimento máximo da string com suporte pelo logcat para fazer com que ele pare de truncar as informações de depuração? A documentação oficial indica que pode não haver, mas talvez o logcat suporte algumas opções adicionais não mencionadas lá?
Respostas:
Há um buffer de tamanho fixo no logcat para logs binários (
/dev/log/events
) e esse limite é de 1024 bytes. Para os registros não binários, também há um limite:Portanto, o tamanho real da mensagem para os logs binários e não binários é de aproximadamente 4076 bytes. A interface do logger do kernel impõe esse
LOGGER_ENTRY_MAX_PAYLOAD
limite.As fontes liblog (usadas pelo logcat) também dizem:
Eu recomendaria a você a ferramenta nxlog que não usa o binário logcat, mas devido às limitações do kernel duvido que resolva seu problema. No entanto, pode valer a pena tentar. (isenção de responsabilidade: eu sou o autor.)
fonte
LOGGER_ENTRY_MAX_PAYLOAD
foi reduzido de 4.076 para 4.068 nas versões mais recentes do Android (veja aqui ).Ok, interessante. Fiquei desapontado ao ver que a resposta era "você não pode realmente expandir isso". Meu pensamento inicial foi dividi-lo para que eu pudesse ver a coisa toda, então aqui eu compartilho com vocês como eu faço exatamente isso (não que seja nada sofisticado nem quase eficiente, mas dá conta do recado):
Editado para mostrar a última string!
fonte
int chunkCount = sb.length() / 4000;
Usoint chunkCount = sb.length() / 4000; if (chunkCount * 4000 < sb.length()) chunkCount++;
else { Log.v(TAG, sb); }
para também imprimir o log quando a mensagem tiver <= 4000 caracteresDivida-o em várias partes recursivamente.
fonte
fonte
Aqui está o código que eu uso - ele trunca as linhas no limite de 4000 enquanto também quebra a linha em novas linhas, em vez de no meio da linha. Torna mais fácil ler o arquivo de log.
Uso:
Implementação:
fonte
O código abaixo é um refinamento do que foi postado por Mark Buikema. Ele quebra a string em novas linhas. Útil para registrar strings JSON longas.
fonte
fonte
nos esta lógica de paginação
fonte
fornecendo minha própria opinião sobre a solução de Travis,
aproveite o fato de que
Log.println()
retorna o número de bytes gravados para evitar a codificação "4000". em seguida, chame-se recursivamente na parte da mensagem que não pôde ser registrada até que não haja mais nada.fonte
Se o seu log for muito longo (por exemplo, registrar todo o dump do seu banco de dados por motivos de depuração etc.), pode acontecer que o logcat evite o log excessivo. Para contornar isso, você pode adicionar um tempo limite evry x milissegundos.
Cuidado, use isso apenas para fins de depuração, pois pode interromper o thread principal dos blocos.
fonte
Como @mhsmith mencionou, o
LOGGER_ENTRY_MAX_PAYLOAD
é 4068 nas versões recentes do Android. No entanto, se você usar 4068 como o comprimento máximo da mensagem nos trechos de código oferecidos em outras respostas, as mensagens serão truncadas. Isso ocorre porque o Android adiciona mais caracteres ao início e ao final da sua mensagem, que também contam. Outras respostas usam o limite de 4000 como solução alternativa. No entanto, é possível realmente usar todo o limite com este código (o código gera uma tag a partir do rastreamento da pilha para mostrar o nome da classe e o número da linha que chamou o log, sinta-se à vontade para modificar isso):fonte
Não conheço nenhuma opção para aumentar o comprimento do logcat, mas podemos encontrar os diferentes logs, como log principal, log de eventos, etc. O log principal geralmente contém tudo, seu comprimento vai até 4Mb. Então você pode conseguir o que perdeu no terminal de log. O caminho é: \ data \ logger.
fonte
Embora as outras soluções fornecidas tenham sido úteis, não fiquei satisfeito com elas, pois não abrangiam casos em que o log era mais longo do que o dobro do LOGGER_ENTRY_MAX_LEN mencionado por @ b0ti. Além disso, mesmo minha solução a seguir não é perfeita, pois o LOGGER_ENTRY_MAX_LEN não é buscado dinamicamente. Se alguém souber de uma maneira de fazer isso, eu adoraria ouvir nos comentários! De qualquer forma, esta é a solução que uso no meu código agora:
fonte