Questo articolo illustra la procedura di logging, inclusi standard di log, linee guida sul livello, classi, scopi e approssimazioni multistack.
Standard dei log
L'accesso in Android è complesso a causa del mix di standard utilizzati che
combinati in logcat
. Di seguito vengono descritti in dettaglio i principali standard utilizzati:
Source | Esempi | Indicazioni a livello di stack |
---|---|---|
RFC 5424 (syslog standard) |
Kernel Linux, molte app Unix | Kernel, daemon di sistema |
android.util.Log |
Framework Android + logging delle app | Framework e app di sistema Android |
java.util.logging.Level |
Logging generale in Java | app non di sistema |
Figura 1: standard a livello di log.
Sebbene ognuno di questi standard abbia una struttura a livello simile, varia granularità. Gli standard approssimati sono i seguenti:
Livello RFC 5424 | Gravità RFC 5424 | Descrizione RFC 5424 | android.util.Log | java.util.logging.Level |
---|---|---|---|---|
0 | Emergenza | Sistema inutilizzabile | Log.e / Log.wtf |
SEVERE |
1 | Avviso | L'azione deve essere eseguita immediatamente | Log.e / Log.wtf |
SEVERE |
2 | Critico | Condizioni critiche | Log.e / Log.wtf |
SEVERE |
3 | Errore | Condizioni di errore | Log.e |
SEVERE |
4 | Avviso | Condizioni di avviso | Log.w |
WARNING |
5 | Avviso | Normale ma significativo | Log.w |
WARNING |
6 | Informazioni | Messaggi informativi | Log.i |
INFO |
7 | Debug | Messaggi a livello di debug | Log.d |
CONFIG , FINE |
- | - | Messaggistica dettagliata | Log.v |
FINER /FINEST |
Figura 2: livelli di logging di syslog
, Android e Java.
Linee guida per il livello di log
Esistono delle linee guida esistenti per ogni standard di log. Il log scelto
segue lo standard appropriato utilizzato, ad esempio l'utilizzo dell'syslog
per lo sviluppo del kernel.
Gli ordini a livello di log, dal più basso al più grande, sono mostrati nelle tre figure seguenti:
ERROR |
Questi log vengono sempre conservati. |
WARN |
Questi log vengono sempre conservati. |
INFO |
Questi log vengono sempre conservati. |
DEBUG |
Questi log vengono compilati, ma eliminati in fase di runtime. |
VERBOSE |
Questi log non vengono mai compilati in un'app, tranne durante sviluppo del prodotto. |
Figura 3: android.util.Log
CONFIG |
Livello per i messaggi di configurazione statici |
FINE |
A livello di messaggio che fornisce informazioni di tracciamento |
FINER |
Indica un messaggio di tracciamento abbastanza dettagliato |
FINEST |
Indica un messaggio di tracciamento molto dettagliato |
INFO |
Livello dei messaggi informativi |
SEVERE |
Livello del messaggio che indica un errore grave |
WARNING |
Livello del messaggio che indica un potenziale problema |
Figura 4: java.util.Logging.Level
.
0 | Emergenza | Sistema inutilizzabile |
1 | Avviso | L'azione deve essere eseguita immediatamente |
2 | Critico | Condizioni critiche |
3 | Errore | Condizioni di errore |
4 | Avviso | Condizioni di avviso |
5 | Avviso | Condizione normale ma significativa |
6 | Informative | Messaggi informativi |
7 | Debug | Messaggi a livello di debug |
Figura 5: RFC 5424
- Sezione
6.2.1.
Logging delle app
Il logging selettivo viene eseguito con TAG
dalla classe android.util.Log
utilizzando Log#isLoggable
,
come mostrato di seguito:
if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) { Log.v("FOO_TAG", "Message for logging."); } |
---|
I log possono essere ottimizzati in fase di runtime per fornire un livello selezionato di logging, come mostrato sotto:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
Le proprietà di log.tag.*
vengono reimpostate al riavvio. Esistono
e varianti permanenti che rimangono anche durante i riavvii. Vedi sotto:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Log#isLoggable
controlli lasciano tracce di log nel codice dell'app. Valore booleano
I flag DEBUG
ignorano le tracce dei log utilizzando ottimizzazioni del compilatore impostate su
false
, come mostrato di seguito:
private final static boolean DEBUG = false; |
---|
Il logging può essere rimosso per ogni APK tramite i set di regole ProGuard tramite R8
all'indirizzo
durante la compilazione. L'esempio seguente rimuove tutti i dati al di sotto del livello INFO
logging per 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 |
---|
È utile per gestire più tipi di build dell'app (ad ad esempio build di sviluppo rispetto a build di release) in cui il codice sottostante è dovrebbe essere lo stesso, ma i livelli di log consentiti sono diversi. Un'esplicita devono essere impostati e seguiti per le app (in particolare app) per stabilire l'impatto dei tipi di build e delle aspettative di rilascio nel log come output.
Logging di sistema nel runtime Android (ART)
Sono disponibili diverse classi disponibili per il sistema app e servizi:
Corso | Scopo |
---|---|
android.telephony.Rlog |
Registrazione radio |
android.util.Log |
Logging generale dell'app |
android.util.EventLog |
Logging degli eventi diagnostici dell'integratore di sistemi |
android.util.Slog |
Logging del framework della piattaforma |
Figura 6: classi e scopi dei log di sistema disponibili.
Sebbene android.util.Log
e android.util.Slog
utilizzino lo stesso livello di log
standard, Slog
è una classe @hide
utilizzabile solo dalla piattaforma. EventLog
vengono mappati alle voci in event.logtags
in /system/etc/event-log-tags
.
Logging nativo
L'accesso in C/C++ segue lo standard syslog
con syslog
(2) corrispondente a
il kernel Linux syslog
che controlla il buffer printk
e syslog
(3)
corrispondente al logger di sistema generale. Android utilizza il liblog
libreria per il logging generale di sistema.
liblog
fornisce i wrapper per i gruppi sublogs utilizzando la seguente macro
modulo:
[Sublog Buffer ID] LOG [Log Level ID] |
RLOGD
, ad esempio, corrisponde a [Radio log buffer ID] LOG [Debug Level]
.
I wrapper liblog
principali sono i seguenti:
Classe wrapper | Funzioni di esempio |
---|---|
log_main.h |
ALOGV , ALOGW |
log_radio.h |
RLOGD , RLOGE |
log_system.h |
SLOGI , SLOGW |
Figura 7: wrapper liblog
.
Android ha interfacce di livello superiore per il logging preferite rispetto a quelle dirette
Utilizzo di liblog
, come mostrato di seguito:
Raccolta | Utilizzo |
---|---|
async_safe |
Libreria solo per il logging da ambienti con segnale asincrono |
libbase |
Libreria di logging che fornisce un'interfaccia di flusso C++ per il logging, simile alla
Logging (glog) in stile Google. libbase è utilizzabile in entrambi i progetti esterni
ed è disponibile nelle app che utilizzano libbase_ndk . |
Figura 8: librerie di log di livello superiore.
Approssimazioni multistack
A causa delle differenze nella granularità e nell'intento del livello, non ci sono
corrispondenze esatte di diversi standard di logging. Ad esempio,
I livelli java.util.logging.Level
e android.util.Log
per i log degli errori non sono un
Corrispondenza 1:1:
java.util.Logging.Level | android.util.Log |
---|---|
GRAVI | Log.wtf |
GRAVI | Log.e |
Figura 9: livello di errore nel logging Java standard rispetto ad Android log.
In casi come questo, utilizza il singolo standard per determinare a quale livello
.
Durante lo sviluppo del sistema con più componenti a livello di stack, segui Figura 1 per determinare quale standard utilizzare per componente. Per una stima approssimativa guida ai messaggi sui livelli, come illustrato nella Figura 2.
Sicurezza e privacy
Non registrare informazioni che consentono l'identificazione personale (PII). Questo include dettagli quali:
- Indirizzi email.
- Numeri di telefono
- Nomi.
Analogamente, alcuni dettagli sono considerati sensibili, anche se non che consentono l'identificazione personale esplicitamente.
Ad esempio, anche se le informazioni sul fuso orario non sono considerate identificabili personalmente,
ma dà un'indicazione della posizione approssimativa di un utente.
I criteri di log e i dettagli accettabili devono essere gestiti nell'ambito della sicurezza e e la revisione della privacy prima di rilasciarle.
Log dispositivo
Accesso a tutti i log del dispositivo, incluso l'utilizzo
android.permission.READ_LOGS
è limitato:
- Se un'app in background richiede l'accesso a tutti i log del dispositivo, la richiesta viene automaticamente negata a meno che l'app:
- Condivide l'UID di sistema.
- Utilizza un processo di sistema nativo (
UID
<APP_UID
). - Usa
DropBoxManager
. - Accede solo al buffer dei log eventi.
- Utilizza l'API
EventLog
. - Utilizza test strumentati.
- Se un'app in primo piano con
READ_LOGS
richiede l'accesso ai log del dispositivo, richiede all'utente di approvare o rifiutare la richiesta di accesso.