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