Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Comprender el registro

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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

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.