Este artículo cubre el proceso de registro, incluidos los estándares de registro, las pautas de nivel, las clases, los propósitos y las aproximaciones de varias pilas.
Estándares de registro
Iniciar sesión en Android es complejo debido a la combinación de estándares utilizados que se combinan en logcat
. Los principales estándares utilizados se detallan a continuación:
Fuente | Ejemplos | Guía de nivel de pila |
---|---|---|
RFC 5424 (estándar syslog ) | Kernel de Linux, muchas aplicaciones de Unix | Kernel, demonios del sistema |
android.util.Log | Marco de Android + registro de aplicaciones | Marco de Android y aplicación del sistema. |
java.util.logging.Level | Inicio de sesión general en Java | aplicación fuera del sistema |
Figura 1: estándares de nivel de registro.
Aunque cada uno de estos estándares tiene una construcción de nivel similar, varían en granularidad. Los equivalentes aproximados en los estándares son los siguientes:
Nivel RFC 5424 | RFC 5424 Gravedad | RFC 5424 Descripción | android.util.Log | java.util.logging.Level |
---|---|---|---|---|
0 | Emergencia | El sistema es inutilizable | Log.e / Log.wtf | SEVERE |
1 | Alerta | Se deben tomar medidas de inmediato | Log.e / Log.wtf | SEVERE |
2 | Crítico | Condiciones críticas | Log.e / Log.wtf | SEVERE |
3 | Error | Condiciones de error | Log.e | SEVERE |
4 | Advertencia | Condiciones de advertencia | Log.w | WARNING |
5 | Aviso | Normal pero significativo | Log.w | WARNING |
6 | Información | Mensajería de información | Log.i | INFO |
7 | Depurar | Mensajes de nivel de depuración | Log.d | CONFIG , FINE |
- | - | Mensajería detallada | Log.v | FINER / MÁS FINEST |
Figura 2: niveles de registro de syslog
, Android y Java.
Pautas de nivel de registro
Existen pautas dadas para cada estándar de registro. El nivel de registro elegido sigue el estándar apropiado que se usa, como usar el estándar syslog
para el desarrollo del kernel.
Los pedidos de nivel de registro, de menor a mayor, se muestran en las tres figuras a continuación:
ERROR | Estos registros siempre se mantienen. |
WARN | Estos registros siempre se mantienen. |
INFO | Estos registros siempre se mantienen. |
DEBUG | Estos registros se compilan pero se eliminan en tiempo de ejecución. |
VERBOSE | Estos registros nunca se compilan en una aplicación, excepto durante el desarrollo. |
Figura 3: android.util.Log
CONFIG | Nivel de mensaje para mensajes de configuración estática |
FINE | Nivel de mensaje que proporciona información de seguimiento |
FINER | Indica un mensaje de rastreo bastante detallado. |
FINEST | Indica un mensaje de seguimiento muy detallado. |
INFO | Nivel de mensaje para mensajes informativos |
SEVERE | Nivel de mensaje que indica un fallo grave |
WARNING | Nivel de mensaje que indica un problema potencial |
Figura 4: java.util.Logging.Level
.
0 | Emergencia | El sistema es inutilizable |
1 | Alerta | Se deben tomar medidas de inmediato |
2 | Crítico | Condiciones críticas |
3 | Error | Condiciones de error |
4 | Advertencia | Condiciones de advertencia |
5 | Aviso | Condición normal pero significativa |
6 | Informativo | Mensajes informativos |
7 | Depurar | Mensajes de nivel de depuración |
Figura 5: RFC 5424
- Sección 6.2.1 .
Registro de aplicaciones
El registro selectivo se realiza con TAG
por la clase android.util.Log
usando Log#isLoggable
, como se muestra a continuación:
if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) { Log.v("FOO_TAG", "Message for logging."); } |
---|
Los registros se pueden ajustar en tiempo de ejecución para proporcionar un nivel seleccionado de registro como se muestra a continuación:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
Las propiedades log.tag.*
se restablecen al reiniciar. Hay variantes persistentes que también permanecen en los reinicios. Vea abajo:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Las comprobaciones Log#isLoggable
dejan rastros de registro en el código de la aplicación. Los indicadores booleanos DEBUG
omiten los seguimientos de registro mediante optimizaciones del compilador que se establecen en false
, como se muestra a continuación:
private final static boolean DEBUG = false; |
---|
El registro se puede eliminar por APK a través de los conjuntos de reglas de ProGuard por R8
en el momento de la compilación. El siguiente ejemplo elimina todo lo que se encuentra debajo del registro de nivel INFO
para android.util.Log
:
# This allows proguard to strip isLoggable() blocks containing only <=INFO log # code from release builds. -assumenosideeffects class android.util.Log { static *** i(...); static *** d(...); static *** v(...); static *** isLoggable(...); } -maximumremovedandroidloglevel 4 |
---|
Esto es útil para manejar múltiples tipos de compilación de aplicaciones (por ejemplo, compilaciones de desarrollo frente a compilaciones de lanzamiento) donde se espera que el código subyacente sea el mismo, pero los niveles de registro permitidos son diferentes. Se debe establecer y seguir una política explícita para las aplicaciones (particularmente las aplicaciones del sistema) para decidir cómo los tipos de compilación y las expectativas de lanzamiento afectan la salida del registro.
Registro del sistema en Android Runtime (ART)
Hay varias clases disponibles para aplicaciones y servicios del sistema:
Clase | Propósito |
---|---|
android.telephony.Rlog | registro de radio |
android.util.Log | Registro general de aplicaciones |
android.util.EventLog | Registro de eventos de diagnóstico del integrador de sistemas |
android.util.Slog | Registro del marco de la plataforma |
Figura 6: Clases y propósitos de registro del sistema disponibles.
Aunque android.util.Log
y android.util.Slog
usan los mismos estándares de nivel de registro, Slog
es una clase @hide
que solo puede usar la plataforma. Los niveles de EventLog
se asignan a las entradas en el archivo event.logtags
en /system/etc/event-log-tags
.
Registro nativo
Iniciar sesión en C/C++ sigue el estándar syslog
con syslog
(2) correspondiente al kernel de Linux syslog
que controla el búfer printk
y syslog
(3) correspondiente al registrador general del sistema. Android usa la biblioteca liblog
para el registro general del sistema.
liblog
proporciona envoltorios para los grupos de subblogs mediante el siguiente formato de macro:
[Sublog Buffer ID] LOG [Log Level ID] |
RLOGD
, por ejemplo, corresponde a [Radio log buffer ID] LOG [Debug Level]
. Los principales envoltorios de liblog
son los siguientes:
Clase contenedora | Funciones de ejemplo |
---|---|
log_main.h | ALOGV , ALOGW |
log_radio.h | RLOGD , RLOGE |
log_system.h | SLOGI , SLOGW |
Figura 7: envoltorios liblog
.
Android tiene interfaces de nivel superior para el registro que se prefieren al uso directo de liblog
, como se ve a continuación:
Biblioteca | Uso |
---|---|
async_safe | Biblioteca solo para iniciar sesión desde entornos seguros de señal asíncrona |
libbase | Biblioteca de registro que proporciona una interfaz de flujo de C++ para el registro, similar al registro de estilo Google (glog). libbase se puede usar en proyectos externos y está disponible en aplicaciones que usan libbase_ndk . |
Figura 8: Bibliotecas de registro de nivel superior.
Aproximaciones multipila
Debido a las diferencias en la granularidad y la intención del nivel, no existen coincidencias claras o exactas de los diferentes estándares de registro. Por ejemplo, los niveles de java.util.logging.Level
y android.util.Log
para los registros de errores no coinciden 1:1:
java.util.Logging.Level | android.util.Log |
---|---|
GRAVE | Log.wtf |
GRAVE | Log.e |
Figura 9: Nivel de error en el registro estándar de Java frente al registro de Android.
En casos como este, use el estándar individual para determinar qué nivel aplicar.
Durante el desarrollo del sistema con múltiples componentes de nivel de pila, siga la Figura 1 para determinar qué estándar usar por componente. Para obtener una guía aproximada de los mensajes de nivel, siga la Figura 2.
Seguridad y privacidad
No registre información de identificación personal (PII). Esto incluye detalles como:
- Correos electrónicos
- Números telefónicos
- nombres
Del mismo modo, ciertos detalles se consideran confidenciales incluso si no son explícitamente identificables personalmente.
Por ejemplo, aunque la información de la zona horaria no se considera identificable personalmente, da una indicación de la ubicación aproximada de un usuario.
La política de registro y los detalles aceptables deben manejarse como parte de la revisión de seguridad y privacidad antes del lanzamiento.