Comprende el registro

Este artículo abarca el proceso de registro, incluidos los estándares de registro, los lineamientos de nivel, clases, propósitos y aproximaciones de pilas múltiples.

Estándares de registro

El registro en Android es complejo debido a la combinación de estándares se combinaron en logcat. Los principales estándares utilizados se detallan a continuación:

Source Ejemplos Orientación a nivel de pila
RFC 5424 (syslog estándar) Kernel de Linux, muchas apps de Unix Kernel, daemons del sistema
android.util.Log Framework de Android y registro de apps App del sistema y framework de Android
java.util.logging.Level Registro general en Java app que no es del sistema

Figura 1: Estándares de nivel de registro.

Aunque cada uno de estos estándares tienen una construcción de niveles similares, varían en nivel de detalle. Los equivalentes aproximados en los estándares son los siguientes:

Nivel RFC 5424 Gravedad RFC 5424 Descripción RFC 5424 android.util.Log java.util.logging.Level
0 Emergencia El sistema no se puede usar 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 Mensajes de información Log.i INFO
7 Depuración Mensajes de nivel de depuración Log.d CONFIG, FINE
- - Mensajes detallados Log.v FINER/FINEST

Figura 2: Niveles de registro de syslog, Android y Java

Lineamientos de nivel de registro

Se proporcionan lineamientos existentes para cada estándar de registro. El registro elegido cumpla con el estándar apropiado que se usa, como usar syslog estándar para el desarrollo de kernel.

Los pedidos de nivel de registro, de menor a mayor, se muestran en las tres figuras a continuación:

ERROR Estos registros se conservan siempre.
WARN Estos registros se conservan siempre.
INFO Estos registros se conservan siempre.
DEBUG Estos registros se compilan, pero se quitan durante el tiempo de ejecución.
VERBOSE Estos registros nunca se compilan en una app, excepto durante en el desarrollo de software.

Figura 3: android.util.Log

CONFIG Nivel de mensaje para los mensajes de configuración estáticos
FINE Nivel de mensaje que proporciona información de seguimiento
FINER Indica un mensaje de seguimiento bastante detallado
FINEST Indica un mensaje de seguimiento muy detallado
INFO Nivel de mensaje para mensajes informativos
SEVERE Nivel de mensaje que indica una falla grave
WARNING Nivel de mensaje que indica un posible problema

Figura 4: java.util.Logging.Level

0 Emergencia El sistema no se puede usar
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 Depuración Mensajes de nivel de depuración

Figura 5: RFC 5424: Sección 6.2.1

Registro de apps

La clase android.util.Log realiza el registro selectivo con TAG mediante 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 el tiempo de ejecución para proporcionar un nivel de registro seleccionado, como se muestra a continuación a continuación:

adb shell setprop log.tag.FOO_TAG VERBOSE

Se restablecen log.tag.* propiedades durante el reinicio. Existen con variantes persistentes que también permanecen en los reinicios. Consulta a continuación:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Las verificaciones de Log#isLoggable dejan seguimientos de registro en el código de la app. Booleano Las marcas DEBUG omiten los seguimientos de registros usando optimizaciones del compilador establecidas en false, como se muestra a continuación:

private final static boolean DEBUG = false;

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

Puedes quitar el registro por APK a través de conjuntos de reglas ProGuard antes del R8 en tiempo de compilación. En el siguiente ejemplo, se quita todo lo que esté por debajo del nivel INFO. registro 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 controlar varios tipos de compilación de apps (por ejemplo, (por ejemplo, compilaciones de desarrollo frente a compilaciones de lanzamiento) en las que el código subyacente está se espera que sean iguales, pero los niveles de registro permitidos son diferentes. Contenido explícito se debe establecer y seguir una política para las apps (particularmente apps) para decidir el impacto que tienen los tipos de compilaciones y las expectativas de los lanzamientos en el registro salida.

Registro del sistema en Android Runtime (ART)

Hay varias clases disponibles que están disponibles para el sistema apps y servicios:

Clase Propósito
android.telephony.Rlog Registro de radio
android.util.Log Registro general de apps
android.util.EventLog Registro de eventos de diagnóstico del integrador de sistema
android.util.Slog Registro del framework de la plataforma

Figura 6: Clases y propósitos de registro del sistema disponibles

Aunque android.util.Log y android.util.Slog usan el mismo nivel de registro Slog es una clase @hide que solo puede usar la plataforma. El EventLog los niveles se asignan a las entradas en el archivo event.logtags en /system/etc/event-log-tags.

Registro nativo

El registro en C/C++ sigue el estándar syslog con syslog(2) correspondiente a el kernel de Linux syslog que controla el búfer printk y syslog(3) correspondiente al registrador general del sistema. Android usa la liblog para los registros generales del sistema.

liblog proporciona wrappers para los grupos de subregistros con la siguiente macro formulario:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD, por ejemplo, corresponde a [Radio log buffer ID] LOG [Debug Level]. Los wrappers liblog principales son los siguientes:

Clase de wrapper Funciones de ejemplo
log_main.h ALOGV, ALOGW
log_radio.h RLOGD, RLOGE
log_system.h SLOGI, SLOGW

Figura 7: Wrappers de liblog

Android tiene interfaces de registro superiores a las directas Uso de liblog, como se muestra a continuación:

Biblioteca Uso
async_safe Biblioteca solo para el registro desde entornos seguros para señales asíncronas
libbase Biblioteca de registros que proporciona una interfaz de transmisión C++ para el registro, similar a Registro al estilo de Google (glog). libbase se puede usar en ambos proyectos externos. y está disponible en las apps que usan libbase_ndk.

Figura 8: Bibliotecas de registro de nivel superior

Aproximaciones de pilas múltiples

Debido a las diferencias en el nivel de detalle y el intent, no hay que coinciden exactamente con los diferentes estándares de registro. Por ejemplo, el Los niveles de java.util.logging.Level y android.util.Log para los registros de errores no son un Coincidencia 1:1:

java.util.Logging.Level android.util.Log
GRAVEDAD Log.wtf
GRAVEDAD Log.e

Figura 9: Nivel de error en el registro estándar de Java en comparación con Android de los datos.

En casos como este, usa el estándar individual para determinar a qué nivel aplicar.

Durante el desarrollo del sistema con varios componentes a nivel de pila, sigue Figura 1 para determinar qué estándar usar por componente. Para obtener un valor aproximado para los mensajes de niveles, sigue la Figura 2.

Seguridad y privacidad

No registres información de identificación personal (PII). Esta incluye detalles como los siguientes:

  • Direcciones de correo electrónico
  • números de teléfono
  • Nombres

Del mismo modo, ciertos detalles se consideran sensibles incluso si no son información personal identificable explícitamente.

Por ejemplo, aunque la información de la zona horaria no se considera de identificación personal, sí brinda una indicación de la ubicación aproximada del usuario.

La política de registros y los detalles aceptables deben manejarse como parte del una revisión de privacidad antes del lanzamiento.

Registros del dispositivo

Acceso a todos los registros del dispositivo, incluido el uso android.permission.READ_LOGS está restringido:

  • Si una app en segundo plano solicita acceso a todos los registros del dispositivo, la solicitud se se rechaza, a menos que la app:
    • Comparte el UID del sistema.
    • Usa un proceso del sistema nativo (UID < APP_UID).
    • Usa DropBoxManager
    • Accede solo al búfer de registro de eventos.
    • Usa la API de EventLog.
    • Usa pruebas instrumentadas.
  • Si una app en primer plano con READ_LOGS solicita acceso a los registros del dispositivo, la el sistema le pide al usuario que apruebe o rechace la solicitud de acceso.