De forma predeterminada, parece que logcat truncará cualquier mensaje de registro que considere "demasiado largo". Esto sucede tanto dentro de Eclipse como cuando se ejecuta logcat en la línea de comando usando adb -d logcat
, y está truncando algunos mensajes de depuración importantes.
¿Hay alguna forma de aumentar la longitud de cadena máxima admitida por logcat para que deje de truncar la información de depuración? La documentación oficial implica que puede que no los haya, pero ¿quizás logcat admita algunas opciones adicionales que no se mencionan allí?
Respuestas:
Hay un búfer de tamaño fijo en logcat para registros binarios (
/dev/log/events
) y este límite es de 1024 bytes. Para los registros no binarios también hay un límite:Por tanto, el tamaño real del mensaje para los registros binarios y no binarios es de ~ 4076 bytes. La interfaz del registrador del kernel impone este
LOGGER_ENTRY_MAX_PAYLOAD
límite.Las fuentes de liblog (utilizadas por logcat) también dicen:
Le recomendaría la herramienta nxlog que no usa el binario logcat, pero debido a las limitaciones del kernel dudo que resuelva su problema. Sin embargo, podría valer la pena intentarlo. (descargo de responsabilidad: soy el autor).
fuente
LOGGER_ENTRY_MAX_PAYLOAD
se ha reducido de 4076 a 4068 en las versiones más recientes de Android (ver aquí ).Ok, interesante. Me decepcionó ver que la respuesta fue "realmente no se puede expandir". Mi pensamiento inicial fue dividirlo para poder verlo todo, así que aquí comparto con ustedes cómo lo hago (no es nada elegante ni eficiente, pero hace el trabajo en un apuro):
¡Editado para mostrar la última cadena!
fuente
int chunkCount = sb.length() / 4000;
int chunkCount = sb.length() / 4000; if (chunkCount * 4000 < sb.length()) chunkCount++;
else { Log.v(TAG, sb); }
para imprimir también el registro cuando el mensaje tiene <= 4000 caracteres de largoDivídalo en varias partes de forma recursiva.
fuente
fuente
Aquí está el código que uso: trunca las líneas en el límite de 4000 mientras que también rompe la línea en nuevas líneas en lugar de en la mitad de la línea. Hace que el archivo de registro sea más fácil de leer.
Uso:
Implementación:
fuente
El siguiente código es un refinamiento de lo publicado por Mark Buikema. Rompe la cuerda en nuevas líneas. Útil para registrar cadenas JSON largas.
fuente
fuente
nosotros esta lógica de paginación
fuente
proporcionando mi propia opinión sobre la solución de Travis,
Aproveche el hecho de que
Log.println()
devuelve el número de bytes escritos para evitar la codificación "4000". luego, llámese de forma recursiva en la parte del mensaje que no pudo registrarse hasta que no quede nada.fuente
Si su registro es muy largo (por ejemplo, registrando el volcado completo de su base de datos por motivos de depuración, etc.) puede suceder que logcat evite un registro excesivo. Para evitar esto, puede agregar un tiempo de espera evry x milisegundos.
Tenga cuidado, use esto solo con fines de depuración, ya que puede detener los bloques del hilo principal.
fuente
Como mencionó @mhsmith, el
LOGGER_ENTRY_MAX_PAYLOAD
es 4068 en las versiones recientes de Android. Sin embargo, si usa 4068 como la longitud máxima del mensaje en los fragmentos de código que se ofrecen en otras respuestas, los mensajes se truncarán. Esto se debe a que Android agrega más caracteres al principio y al final de su mensaje, que también cuentan. Otras respuestas usan el límite de 4000 como solución. Sin embargo, es posible usar realmente todo el límite con este código (el código genera una etiqueta a partir del seguimiento de la pila para mostrar el nombre de la clase y el número de línea que llamó al registro, no dude en modificarlo):fuente
No conozco ninguna opción para aumentar la longitud de logcat, pero podemos encontrar los diferentes registros como el registro principal, el registro de eventos, etc. El registro principal generalmente contiene todo lo que su longitud va hasta 4Mb. Así que es posible que pueda obtener lo que perdió en la terminal de registro. La ruta es: \ data \ logger.
fuente
Aunque las otras soluciones proporcionadas fueron útiles, no me satisfizo porque no cubrieron los casos en que el registro es más largo que el doble que el LOGGER_ENTRY_MAX_LEN mencionado por @ b0ti. Además, incluso mi siguiente solución no es perfecta ya que LOGGER_ENTRY_MAX_LEN no se recupera dinámicamente. Si alguien conoce una forma de hacer esto, ¡me encantaría escucharlo en los comentarios! De todos modos, esta es la solución que uso en mi código en este momento:
fuente