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; |
---|
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.