Entender a geração de registros

Este artigo aborda o processo de geração de registros, incluindo padrões, diretrizes de nível, classes, propósitos e aproximações de várias pilhas.

Padrões de registro

A geração de registros no Android é complexa, devido à combinação de padrões usados que são combinados em logcat. Os principais padrões usados estão detalhados abaixo:

Fonte Exemplos Orientações no nível da pilha
RFC 5424 (syslog padrão) Kernel do Linux, muitos apps Unix Kernel, daemons do sistema
android.util.Log Framework do Android + geração de registros de apps App do sistema e framework do Android
java.util.logging.Level Geração de registros geral em Java app que não é do sistema

Figura 1. Padrões de nível de registro.

Embora cada um desses padrões tenha uma construção de nível semelhante, eles variam em granularidade. Os equivalentes aproximados nos padrões são os seguintes:

Nível RFC 5424 Gravidade do RFC 5424 Descrição do RFC 5424 android.util.Log (em inglês) java.util.logging.Level (em inglês)
0 Emergência O sistema não pode ser usado Log.e / Log.wtf SEVERE
1 Alerta A ação precisa ser realizada imediatamente Log.e / Log.wtf SEVERE
2 Critical Condições críticas Log.e / Log.wtf SEVERE
3 Erro Condições de erro Log.e SEVERE
4 Alerta Condições de alerta Log.w WARNING
5 Aviso Normal, mas significativa Log.w WARNING
6 Informações Mensagens informativas Log.i INFO
7 Depuração Mensagens no nível de depuração Log.d CONFIG, FINE
- - Mensagens detalhadas Log.v FINER / FINEST

Figura 2:níveis de geração de registros syslog, Android e Java.

Diretrizes de nível de registro

Existem diretrizes para cada padrão de registro. O registro escolhido nível segue o padrão apropriado, como usar o syslog padrão para desenvolvimento de kernel.

As ordens no nível de registro, do menor ao maior, são mostradas nas três figuras abaixo:

ERROR Esses registros são sempre mantidos.
WARN Esses registros são sempre mantidos.
INFO Esses registros são sempre mantidos.
DEBUG Esses registros são compilados, mas removidos no tempo de execução.
VERBOSE Esses registros nunca são compilados em um aplicativo, exceto durante no desenvolvimento de software.

Figura 3: android.util.Log

CONFIG Nível da mensagem para mensagens de configuração estáticas
FINE Nível da mensagem que fornece informações de rastreamento
FINER Indica uma mensagem de rastreamento bastante detalhada
FINEST Indica uma mensagem de rastreamento altamente detalhada
INFO Nível da mensagem para mensagens informativas
SEVERE Nível da mensagem indicando uma falha grave
WARNING Nível da mensagem indicando um possível problema

Figura 4:java.util.Logging.Level.

0 Emergência O sistema não pode ser usado
1 Alerta A ação precisa ser realizada imediatamente
2 Critical Condições críticas
3 Erro Condições de erro
4 Alerta Condições de alerta
5 Aviso Condição normal, mas significativa
6 Informativo Mensagens informativas
7 Depuração Mensagens no nível de depuração

Figura 5: RFC 5424 – Seção 6.2.1.

Geração de registros do app

A geração de registros seletiva é realizada com TAG pela classe android.util.Log usando Log#isLoggable (link em inglês). conforme mostrado abaixo:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

Os registros podem ser ajustados no tempo de execução para fornecer um nível selecionado de registro, conforme mostrado abaixo:

adb shell setprop log.tag.FOO_TAG VERBOSE

As propriedades de log.tag.* são redefinidas na reinicialização. Existem que permanecem nas reinicializações. Confira abaixo:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

As verificações de Log#isLoggable deixam rastros de registro no código do app. Booleano As flags DEBUG ignoram os traces de registro usando otimizações do compilador definidas como false, conforme mostrado abaixo:

private final static boolean DEBUG = false;

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

.

A geração de registros pode ser removida por APK via conjuntos de regras do ProGuard até R8 em tempo de compilação. O exemplo a seguir remove tudo abaixo do nível de INFO geração de registros 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

Isso é útil para lidar com vários tipos de compilação de aplicativo (por exemplo, builds de desenvolvimento versus builds de lançamento) em que o código subjacente é devem ser os mesmos, mas os níveis de registro permitidos são diferentes. Uma linguagem explícita política precisa ser definida e seguida para apps, principalmente os do apps) para decidir como os tipos de build e as expectativas de lançamento afetam o registro saída.

Geração de registros do sistema no Android Runtime (ART)

Há várias classes disponíveis para consultas apps e serviços:

Turma Objetivo
android.telephony.Rlog Registro de rádio
android.util.Log Geração de registros geral de apps
android.util.EventLog Geração de registros de eventos de diagnóstico do integrador de sistemas
android.util.Slog Geração de registros do framework da plataforma

Figura 6. Classes e finalidades de registro do sistema disponíveis.

Embora android.util.Log e android.util.Slog usem o mesmo nível de registro Slog é uma classe @hide que pode ser usada apenas pela plataforma. O EventLog níveis são mapeados para as entradas no event.logtags arquivo em /system/etc/event-log-tags.

Geração de registros nativa

A geração de registros em C/C++ segue o padrão syslog, com syslog(2) correspondendo a syslog do kernel do Linux que controla o buffer printk; e syslog(3) que corresponda ao logger geral do sistema. O Android usa liblog. para registros gerais do sistema.

liblog fornece wrappers para os grupos de subregistros usando a macro a seguir formulário:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD, por exemplo, corresponde a [Radio log buffer ID] LOG [Debug Level]. Os principais wrappers liblog são os seguintes:

Classe wrapper Exemplos de funções
log_main.h ALOGV, ALOGW
log_radio.h RLOGD, RLOGE
log_system.h SLOGI, SLOGW

Figura 7:wrappers liblog.

O Android tem interfaces de nível superior para geração de registros, que são mais favorecidas em relação a consultas diretas liblog, conforme mostrado abaixo:

Biblioteca Uso
async_safe Biblioteca apenas para geração de registros de ambientes com segurança de sinal assíncrono
libbase Biblioteca do Logging que fornece uma interface de stream em C++ para geração de registros, semelhante à Geração de registros no estilo Google (glog). libbase pode ser usado em projetos externos e está disponível em apps que usam libbase_ndk.

Figura 8: bibliotecas de registros de nível superior.

Aproximações de várias pilhas

Devido a diferenças na granularidade e na intenção de nível, não há informações claras correspondências exatas de diferentes padrões de registro. Por exemplo, o Os níveis java.util.logging.Level e android.util.Log para registros de erro não são um Correspondência individual:

java.util.Logging.Level (link em inglês) android.util.Log (em inglês)
SÉRIO Log.wtf
SÉRIO Log.e

Figura 9:nível de erro na geração de registros do Java padrão em comparação com o Android geração de registros.

Nesses casos, use o padrão individual para determinar em qual nível se aplicam.

Durante o desenvolvimento do sistema com vários componentes no nível da pilha, siga Figura 1 para determinar qual padrão usar por componente. Aproximadamente para mensagens de nível, siga a Figura 2.

Segurança e privacidade

Não registre informações de identificação pessoal (PII). Isso inclui detalhes como:

  • Endereços de e-mail
  • Números de telefone
  • Nomes

Da mesma forma, alguns detalhes são considerados sensíveis, mesmo que não explicitamente identificáveis pessoalmente.

Por exemplo, embora as informações de fuso horário não sejam consideradas de identificação pessoal, mas fornece uma indicação da localização aproximada de um usuário.

A política de registro e os detalhes aceitáveis precisam ser tratados como parte da antes do lançamento.

Registros do dispositivo

Acesso a todos os registros do dispositivo, incluindo o uso android.permission.READ_LOGS é restrito:

  • Se um app em segundo plano solicitar acesso a todos os registros do dispositivo, a solicitação será automaticamente negado, a menos que o aplicativo:
    • Compartilha o UID do sistema.
    • Usa um processo do sistema nativo (UID < APP_UID).
    • Usa DropBoxManager
    • Acessa somente o buffer do log de eventos.
    • Usa a API EventLog.
    • Usa testes instrumentados.
  • Se um app em primeiro plano com READ_LOGS solicitar acesso aos registros do dispositivo, o sistema solicita que o usuário aprove ou negue a solicitação de acesso.

.