Logcat es una herramienta de línea de comandos que vuelca un registro de mensajes del sistema, incluidos los seguimientos de pila, los casos de error del sistema y los mensajes que escribes desde tu app con la clase Log
.
En esta página, se explica la herramienta de línea de comandos logcat, pero también puedes ver mensajes de registro en la ventana Logcat de Android Studio. Para obtener información sobre cómo visualizar y filtrar registros desde Android Studio, consulta Cómo escribir y ver registros con Logcat.
Descripción general del sistema de registro
El sistema de registro de Android es un conjunto de búferes circulares estructurados que mantiene el proceso del sistema logd
. El sistema fija y define el conjunto de búferes disponibles. Los más relevantes son los siguientes: main
, que almacena la mayoría de los registros de aplicaciones; system
, que almacena mensajes provenientes del SO Android, y crash
, que almacena registros de fallas. Cada entrada de registro tiene una prioridad (una entre VERBOSE
, DEBUG
, INFO
, WARNING
, ERROR
o FATAL
), una etiqueta que identifica el origen del registro y el mensaje de registro real.
La interfaz principal para el sistema de registro es la biblioteca compartida liblog
y su encabezado <android/log.h>
.
Todas las utilidades de registro específicas de lenguaje finalmente llaman a la función __android_log_write
. De forma predeterminada, llama a la función __android_log_logd_logger
, que envía la entrada de registro a logd
mediante un socket. A partir del nivel de API 30, se puede cambiar la función de registro llamando a __android_set_log_writer
. Puedes encontrar más información en la documentación del NDK.
Los registros que muestra adb logcat
se someten a cuatro niveles de filtrado:
- Filtrado en el tiempo de compilación: según la configuración de compilación, es posible que algunos registros se quiten por completo del objeto binario. Por ejemplo, se puede configurar ProGuard para quitar llamadas a
Log.d
del código Java. - Filtrado de propiedades del sistema:
liblog
consulta un conjunto de propiedades del sistema para determinar el nivel de gravedad mínimo que se enviará alogd
. Si tus registros tienen la etiquetaMyApp
, se verifican las propiedades indicadas a continuación, las cuales deberían contener la primera letra de la gravedad mínima (V
,D
,I
,W
,E
oS
para inhabilitar todos los registros): log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
- Filtrado de aplicaciones: si no se configura ninguna de las propiedades,
liblog
usa la prioridad mínima establecida por__android_log_set_minimum_priority
. La configuración predeterminada esINFO
. - Filtros de visualización:
adb logcat
admite filtros adicionales que pueden reducir la cantidad de registros que se muestran enlogd
. Consulta la siguiente información para obtener más detalles.
Sintaxis de la línea de comandos
Para ejecutar Logcat a través del shell de ADB, el uso general es el siguiente:
[adb] logcat [<option>] ... [<filter-spec>] ...
Puedes ejecutar logcat
como comando de adb o directamente en una solicitud de shell de tu emulador o dispositivo conectado. Para ver resultados de registro mediante abd, dirígete al directorio platform-tools/
del SDK y ejecuta lo siguiente:
adb logcat
Para obtener ayuda en línea de logcat
, inicia un dispositivo y luego ejecuta lo siguiente:
adb logcat --help
Puedes crear una conexión de shell con un dispositivo y ejecutar lo siguiente:
$ adb shell # logcat
Opciones
En la tabla siguiente, se describen las opciones de línea de comandos de logcat
.
Opción | Descripción |
---|---|
-b <buffer> |
Carga o alterna búferes de registro para visualización, como events o radio . El conjunto de búferes main , system y crash se usa de forma predeterminada. Consulta Cómo ver búferes de registro alternativos. |
-c, --clear |
Borra (vacía) los búferes seleccionados y finaliza. El conjunto de búferes predeterminado es main , system y crash . Para borrar todos los búferes, usa -b all -c .
|
|
Solo imprime líneas en las que el mensaje de registro coincide con <expr> , donde <expr> es una expresión regular. |
|
Finaliza después de imprimir <count> líneas. Esto está destinado a vincularse con --regex , pero funcionará por su cuenta. |
--print |
Se vincula con --regex y --max-count para permitir que el contenido omita el filtro de expresiones regulares, pero igual se detiene en el número correcto de coincidencias. |
-d |
Vuelca el registro en la pantalla y finaliza. |
-f <filename> |
Escribe el resultado del mensaje de registro en formato <filename> . El valor predeterminado es stdout . |
-g, --buffer-size |
Imprime el tamaño del búfer del registro especificado y finaliza. |
-n <count> |
Fija la cantidad máxima de registros rotados en <count> . El valor predeterminado es 4. Requiere la opción -r . |
-r <kbytes> |
Rota el archivo de registro cada <kbytes> de resultados. El valor predeterminado es 16. Requiere la opción -f . |
-s |
Equivale a la expresión de filtro '*:S' , que establece la prioridad para todas las etiquetas como "silent", y se usa a fin de preceder a una lista de filterspecs que agregan contenido. Para obtener más información, ve a la sección en la que se explica cómo filtrar de resultados de registros.
|
-v <format> |
Fija el formato de salida para los mensajes del registro. El formato predeterminado es threadtime . Para ver la lista de formatos admitidos, consulta Cómo controlar el formato de los resultados de los registros.
|
-D, --dividers |
Imprime divisores entre cada búfer de registro. |
-c |
Vacía (borra) todo el registro y finaliza. |
-t <count> |
Imprime solo la cantidad de líneas más reciente. Esta opción incluye la funcionalidad -d . |
-t '<time>' |
Imprime las líneas más recientes desde el tiempo especificado. Esta opción incluye la funcionalidad -d . Consulta la opción -P para obtener información sobre los parámetros de comillas con espacios incrustados.
adb logcat -t '01-26 20:52:41.820' |
-T <count> |
Imprime el número más reciente de líneas desde el tiempo especificado. Esta opción no incluye la funcionalidad -d . |
-T '<time>' |
Imprime las líneas más recientes desde el tiempo especificado. Esta opción no incluye la funcionalidad -d . Consulta la opción -P para obtener información sobre los parámetros de comillas con espacios incrustados.
adb logcat -t '01-26 20:52:41.820' |
-L, -last |
Vuelca los registros anteriores al último reinicio. |
-B, --binary |
Muestra el resultado del registro en objetos binarios. |
-S, --statistics |
Incluye estadísticas en el resultado para ayudarte a identificar y dirigirte a los generadores de spam de registros. |
-G <size> |
Establece el tamaño del búfer de anillo de registro. Puede agregar K o M al final para indicar los kilobytes o megabytes. |
-p, --prune |
Imprime (lee) las listas actuales de anunciantes permitidos (white ) y de bloqueo (black ), y no toma argumentos, de la siguiente manera:adb logcat -p |
-P '<list> ...'
|
Escribe (configura) las listas de anunciantes permitidos (white ) y de bloqueo (black ) a fin de ajustar el contenido de registro para un propósito específico. Proporciona un contenido mixto de las entradas de las listas de permisos (<white> ) y de elementos rechazados (~<black> ), en las que <white> o <black> pueden ser UID, UID/PID o /PID: Con la guía de las estadísticas de logcat (logcat -S ), se pueden considerar ajustes para las listas de permisos (white ) y elementos rechazados (black ) para fines como los siguientes:
De forma predeterminada, el sistema de registro evita automáticamente la peor fuente de error en las estadísticas de registro dinámicamente para dejar espacio para mensajes de registro nuevos. Una vez que agotó las heurísticas, el sistema elimina las entradas más antiguas a fin de dejar espacio para los mensajes nuevos.
Agregar una lista de anunciantes permitidos ( Comillas
$ adb logcat -P '"<white_and_blacklist>"' or adb shell $ logcat -P '<white_and_blacklist>'
En el siguiente ejemplo, se especifica una lista de anunciantes permitidos ( adb logcat -P '"/32676 675 ~/32677 897"' A continuación, se muestran las variaciones de comando de lista de anunciantes permitidos ( ~! worst uid blacklist ~1000/! worst pid in system (1000) |
--pid=<pid> ... |
Solo imprime registros desde el PID dado. |
--wrap |
Se suspende durante 2 horas o cuando el búfer está a punto de ajustarse (lo que ocurra primero). Mejora la eficiencia del sondeo al proporcionar una activación para el momento en que está por ajustarse. |
Cómo filtrar resultados de registros
- La etiqueta de un mensaje de registro es una string corta que indica el componente del sistema donde se origina el mensaje (por ejemplo, "view" para el sistema de vista).
- La prioridad es uno de los siguientes valores de caracteres ordenados de la prioridad más baja a la más alta:
-
V
: Verbose (prioridad más baja)D
: DebugI
: InfoW
: WarningE
: ErrorF
: FatalS
: Silent (prioridad más alta en la que nunca se imprime nada)
Puedes obtener la lista de las etiquetas que se usan en el sistema, junto con las prioridades, ejecutando Logcat y observando las dos primeras columnas de cada mensaje, indicadas como <priority>/<tag>
.
El siguiente es un ejemplo de un breve resultado de logcat obtenido con el comando logcat -v brief output
. Muestra que el mensaje está relacionado con el nivel de prioridad "I" y la etiqueta "ActivityManager":
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
Para reducir los resultados del registro a un nivel fácil de manejar, puedes restringir los resultados del registro usando expresiones de filtro. Las expresiones de filtro te permiten indicar al sistema las combinaciones de etiqueta y prioridad que te interesan; el sistema omite otros mensajes para las etiquetas especificadas.
Una expresión de filtro tiene este formato tag:priority ...
, en el que tag
indica la etiqueta de interés y priority
indica el nivel de prioridad mínimo que se debe informar para esa etiqueta. Los mensajes para esa etiqueta que posean el nivel de prioridad especificado o un nivel superior se escriben en el registro. Puedes proporcionar cualquier cantidad de especificaciones tag:priority
en una sola expresión de filtro. Las series de especificaciones están delimitadas por espacios en blanco.
A continuación, te mostramos un ejemplo de una expresión de filtro que suprime todos los mensajes del registro excepto los que tienen la etiqueta "ActivityManager", con prioridad "Info" o más alta, y todos los mensajes del registro con la etiqueta "MyApp" y la prioridad "Debug" o más alta:
adb logcat ActivityManager:I MyApp:D *:S
El elemento final en la expresión anterior, *:S
, fija el nivel de prioridad para todas las etiquetas en "silent", lo cual garantiza que solo se muestren los mensajes del registro con "ActivityManager" y "MyApp". Usar *:S
es una excelente manera de garantizar que los resultados del registro se limiten a los filtros que especificaste de forma explícita, ya que permite que tus filtros sirvan como una lista de anunciantes permitidos para el resultado del registro.
La siguiente expresión de filtro muestra todos los mensajes del registro con nivel de prioridad “warning” o superior en todas las etiquetas:
adb logcat *:W
Si ejecutas logcat desde tu computadora de desarrollo (en lugar de ejecutarlo en un shell de adb remoto), también puedes establecer una expresión de filtro predeterminada exportando un valor para la variable de entorno ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Ten en cuenta que el filtro ANDROID_LOG_TAGS
no se exporta a la instancia del emulador o dispositivo si ejecutas logcat desde un shell remoto o con adb shell
logcat
.
Cómo controlar el formato de los resultados de los registros
Los mensajes de registro contienen varios campos de metadatos además de la etiqueta y la prioridad. Puedes modificar el formato de salida para los mensajes de modo que muestren un campo de metadatos específico. Para hacerlo, usa la opción -v
y especifica uno de los formatos de salida admitidos que se indican a continuación.
brief
: muestra la prioridad, la etiqueta y el PID del proceso que emite el mensaje.long
: muestra todos los campos de metadatos y mensajes separados por líneas en blanco.process
: muestra solo el PID.raw
: Muestra el mensaje del registro sin formato y sin otros campos de metadatos.tag
: muestra la prioridad y la etiqueta únicamente.thread:
: es un formato heredado que muestra la prioridad, el PID y el TID del subproceso que emite el mensaje.threadtime
(opción predeterminada): muestra la fecha, la hora de invocación, la prioridad, la etiqueta, el PID y el TID del subproceso que emite el mensaje.time
: muestra la fecha, la hora de invocación, la prioridad y la etiqueta, y el PID del proceso que emite el mensaje.
Cuando inicias logcat, puedes especificar el formato de salida que desees usando la opción -v
:
[adb] logcat [-v <format>]
A continuación, te mostramos un ejemplo de generación de mensajes con formato de salida thread
:
adb logcat -v thread
Ten en cuenta que solo puedes especificar un formato de salida con la opción -v
, pero puedes especificar todos los modificadores que tengan sentido. Logcat ignora los modificadores que no tienen sentido.
Modificadores de formato
Los modificadores de formato cambian el resultado de logcat en términos de cualquier combinación de uno o más de los siguientes modificadores. Para especificar un modificador de formato, usa la opción -v
de la siguiente manera:
adb logcat -b all -v color -d
Todos los mensajes de registro de Android tienen una etiqueta y una prioridad asociadas a ellos.
Puedes combinar cualquier modificador de formato con cualquiera de las siguientes opciones de formato: brief
, long
, process
, raw
, tag
, thread
, threadtime
y time
.
Puedes obtener los detalles del modificador de formato escribiendo logcat -v --help
en la línea de comandos.
color
: Muestra cada nivel de prioridad con un color diferente.descriptive
: muestra descripciones de eventos de búferes de registro. Este modificador afecta solo a los mensajes del búfer del registro de eventos y no funciona con otros búferes no binarios. Las descripciones de eventos provienen de la base de datos de etiquetas de registro de eventos.epoch
: muestra la hora en segundos a partir del 1 de enero de 1970.monotonic
: Muestra el tiempo en segundos de la CPU a partir del último inicio.printable
: garantiza que se escape cualquier contenido de registro binario.uid
: si los controles de acceso lo permiten, muestra el UID o ID de Android del proceso registrado.usec
: muestra la hora con precisión hasta microsegundos.UTC
: Muestra la hora como UTC.year
: Agrega el año a la hora que se muestra.zone
: Agrega la zona horaria local a la hora que se muestra.
Cómo ver búferes de registro alternativos
El sistema de registro de Android mantiene varios búferes circulares para los mensajes de registro, y no todos los mensajes de registro se envían al búfer circular predeterminado. Para ver mensajes de registro adicionales, puedes ejecutar el comando logcat
con la opción -b
a fin de solicitar la visualización de un búfer circular alternativo. Puedes ver cualquiera de los siguientes búferes alternativos:
radio
: muestra el búfer que contiene mensajes de radio y telefonía.events
: muestra los mensajes del búfer de eventos del sistema binario interpretados.main
: muestra que el búfer del registro principal (predeterminado) no incluye mensajes de registro del sistema y las fallas.system
: muestra el búfer de registro del sistema (predeterminado).crash
: Muestra el búfer de registro de fallas (predeterminado).all
: muestra todos los búferes.default
: muestra informes de los búferesmain
,system
ycrash
.
La utilidad de la opción -b
es la siguiente:
[adb] logcat [-b <buffer>]
A continuación, te mostramos un ejemplo de visualización de un búfer de registro que contiene mensajes de radio y telefonía:
adb logcat -b radio
También puedes especificar varias marcas -b
para todos los búferes que deseas imprimir de la siguiente manera:
logcat -b main -b radio -b events
Puedes especificar una sola marca -b
con una lista de búferes separados por comas, por ejemplo:
logcat -b main,radio,events
Registro desde el código
La clase Log
te permite crear en tu código entradas de registro que aparezcan en la herramienta logcat. Entre los métodos de registro comunes se incluyen los siguientes:
Log.v(String, String)
(registro detallado)Log.d(String, String)
(depuración)Log.i(String, String)
(información)Log.w(String, String)
(advertencia)Log.e(String, String)
(error)
Por ejemplo, usando la siguiente llamada:
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
Los resultados de Logcat se aproximan a los siguientes:
I/MyActivity( 1557): MyClass.getView() — get item number 1