Comprendre la journalisation

Cet article couvre le processus de journalisation, y compris les normes de journalisation, les consignes relatives aux niveaux, les classes, les objectifs et les approximations multipile.

Normes de journalisation

La journalisation dans Android est complexe, en raison de la combinaison de normes utilisées combinées dans logcat. Les principales normes utilisées sont détaillées ci-dessous:

Source Exemples Conseils au niveau de la pile
RFC 5424 (syslog standard) Noyau Linux, nombreuses applications Unix Noyau, daemons système
android.util.Log Framework Android et journalisation des applications Framework Android et application système
java.util.logging.Level Journalisation générale en Java application non système

Figure 1:Normes de niveau de journalisation

Bien que ces normes aient toutes un niveau de construction similaire, elles varient de précision. Les équivalents approximatifs des normes sont les suivants:

Niveau RFC 5424 Gravité RFC 5424 Description RFC 5424 android.util.Log java.util.logging.Level
0 Urgence Le système est inutilisable Log.e / Log.wtf SEVERE
1 Alerte Action immédiate requise Log.e / Log.wtf SEVERE
2 Critical (Critique) Conditions critiques Log.e / Log.wtf SEVERE
3 Erreur Conditions d'erreur Log.e SEVERE
4 Avertissement Conditions d'avertissement Log.w WARNING
5 Avis Normale, mais significative Log.w WARNING
6 Infos Messages d'information Log.i INFO
7 Déboguer Messages de débogage Log.d CONFIG, FINE
- - Messages détaillés Log.v FINER/FINEST

Figure 2:Niveaux de journalisation syslog, Android et Java

Consignes au niveau des journaux

Des consignes existent pour chaque norme de journalisation. Journal choisi respecte la norme appropriée, comme l'utilisation de syslog pour le développement de noyaux.

Les trois figures ci-dessous illustrent les ordres de niveau de journalisation, du plus petit au plus grand:

ERROR Ces journaux sont toujours conservés.
WARN Ces journaux sont toujours conservés.
INFO Ces journaux sont toujours conservés.
DEBUG Ces journaux sont compilés, mais supprimés au moment de l'exécution.
VERBOSE Ces journaux ne sont jamais compilés dans une application, sauf développement d'applications.

Figure 3:android.util.Log

CONFIG Au niveau des messages de configuration statiques
FINE Informations de suivi fournies au niveau du message
FINER Indique un message de traçage assez détaillé
FINEST Indique un message de traçage très détaillé
INFO Niveau des messages d'information
SEVERE Niveau du message indiquant un échec grave
WARNING Niveau du message indiquant un problème potentiel

Figure 4:java.util.Logging.Level

0 Urgence Le système est inutilisable
1 Alerte Action immédiate requise
2 Critical (Critique) Conditions critiques
3 Erreur Conditions d'erreur
4 Avertissement Conditions d'avertissement
5 Avis État normal, mais important
6 Informatif Messages d'information
7 Déboguer Messages de débogage

Figure 5:RFC 5424 (section) 6.2.1.

Journalisation des applications

La journalisation sélective est effectuée avec TAG par la classe android.util.Log à l'aide de Log#isLoggable. comme indiqué ci-dessous:

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

Les journaux peuvent être réglés au moment de l'exécution pour fournir un niveau de journalisation spécifique, comme illustré ci-dessous:

adb shell setprop log.tag.FOO_TAG VERBOSE

Les propriétés log.tag.* sont réinitialisées au redémarrage. Il y a des variantes persistantes qui subsistent après les redémarrages. Voir ci-dessous:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Les vérifications Log#isLoggable laissent des traces de journal dans le code de l'application. Booléen Les indicateurs DEBUG contournent les traces de journal à l'aide d'optimisations du compilateur définies sur false, comme indiqué ci-dessous:

private final static boolean DEBUG = false;

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

La journalisation peut être supprimée pour chaque APK via les ensembles de règles ProGuard par R8 à l'adresse à la compilation. L'exemple suivant supprime tout ce qui se trouve en dessous du niveau INFO Logging pour 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

Cela est utile pour gérer plusieurs types de compilation d'application (par exemple, (par exemple, compilations de développement ou builds), où le code sous-jacent est s'attendaient à être identiques, mais les niveaux de journalisation autorisés sont différents. Une description explicite doit être définie et suivie pour les applications applications) pour déterminer l'impact des types de compilation et des attentes concernant les versions sur le journal de sortie.

Journalisation système dans l'environnement d'exécution Android Runtime (ART)

Plusieurs classes sont disponibles pour les systèmes applications et services:

Cours Objectif
android.telephony.Rlog Journalisation radio
android.util.Log Journalisation générale des applications
android.util.EventLog Journalisation des événements de diagnostic de l'intégrateur système
android.util.Slog Journalisation du framework de la plate-forme

Figure 6:Classes et objectifs des journaux système disponibles

Bien que android.util.Log et android.util.Slog utilisent le même niveau de journalisation Slog est une classe @hide utilisable uniquement par la plate-forme. EventLog niveaux sont mappés aux entrées de la classe event.logtags dans /system/etc/event-log-tags.

Journalisation native

La journalisation en C/C++ respecte la norme syslog avec syslog(2) correspondant à Le noyau Linux syslog qui contrôle le tampon printk et syslog(3) correspondant à l'enregistreur système général. Android utilise l'liblog pour la journalisation générale du système.

liblog fournit des wrappers pour les groupes de sous-journaux à l'aide de la macro suivante : formulaire:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD, par exemple, correspond à [Radio log buffer ID] LOG [Debug Level]. Les principaux wrappers liblog sont les suivants:

Classe de wrapper Exemples de fonctions
log_main.h ALOGV, ALOGW
log_radio.h RLOGD, RLOGE
log_system.h SLOGI, SLOGW

Figure 7:Wrappers liblog

Android dispose d'interfaces de journalisation de niveau supérieur, à privilégier par rapport aux interfaces directes Utilisation de liblog, comme illustré ci-dessous:

Bibliothèque Utilisation
async_safe Bibliothèque réservée à la journalisation à partir d'environnements sécurisés pour les signaux asynchrones
libbase Bibliothèque Logging qui fournit une interface de flux C++ à la journalisation, semblable à Journalisation de style Google (glog). libbase peut être utilisé dans les deux projets externes et est disponible dans les applications utilisant libbase_ndk.

Figure 8:Bibliothèques de journaux de niveau supérieur

Approximations multipile

En raison des différences de précision et de niveau d'intention, il n'existe aucune les correspondances exactes des différentes normes de journalisation. Par exemple, Les niveaux java.util.logging.Level et android.util.Log des journaux d'erreurs ne sont pas des Correspondance 1:1:

java.util.Logging.Level android.util.Log
SÉVÈRE Log.wtf
SÉVÈRE Log.e

Figure 9:Niveau d'erreur dans la journalisation Java standard par rapport à Android la journalisation.

Dans ce cas, utilisez la norme individuelle pour déterminer à quel niveau s'appliquent.

Pendant le développement du système avec plusieurs composants au niveau de la pile, suivez la figure 1 pour déterminer quelle norme utiliser pour chaque composant. Pour une estimation guide des messages concernant les niveaux, reportez-vous à la figure 2.

Sécurité et confidentialité

Ne consignez pas d'informations permettant d'identifier personnellement l'utilisateur. Ce inclut des informations telles que:

  • Adresses e-mail
  • Numéros de téléphone
  • Les noms

De même, certaines informations sont considérées comme sensibles, même explicitement permettant d'identifier personnellement.

Par exemple, bien que les informations de fuseau horaire ne soient pas considérées comme personnellement identifiables, cela donne une indication de la position approximative d'un utilisateur.

La politique des journaux et les informations acceptables doivent être traitées pour des raisons de sécurité et de confidentialité avant leur sortie.

Journaux de l'appareil

Accès à tous les journaux de l'appareil, y compris via android.permission.READ_LOGS est limité:

  • Si une application en arrière-plan demande l'accès à tous les journaux de l'appareil, la demande est automatiquement refusé, sauf si l'application:
    • Partage l'UID du système.
    • Utilise un processus système natif (UID < APP_UID).
    • Fuseau horaire : DropBoxManager.
    • Accède uniquement au tampon du journal des événements.
    • Utilise l'API EventLog.
    • Utilise des tests d'instrumentation.
  • Si une application au premier plan avec READ_LOGS demande l'accès aux journaux de l'appareil, système invite l’utilisateur à approuver ou à refuser la demande d’accès.