Je suppose que la plupart d'entre vous connaissent android.util.Log Toutes les méthodes de journalisation acceptent la «balise String» comme premier argument.
Et ma question est: Comment marquez-vous habituellement vos journaux dans vos applications? J'ai vu un code en dur comme celui-ci:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Cela n'a pas l'air sympa pour de nombreuses raisons:
- Vous pouvez me dire que ce code n'a pas de code en dur, mais c'est le cas.
- Mon application peut avoir n'importe quel nombre de classes dans différents packages avec le même nom. Il serait donc difficile de lire le journal.
- Ce n'est pas flexible. Vous avez toujours mis un TAG de champ privé dans votre classe.
Existe-t-il un moyen efficace d'obtenir un TAG pour une classe?
Réponses:
J'utilise un TAG, mais je l'initialise comme ceci:
De cette façon, lorsque je refactorise mon code, la balise changera également en conséquence.
la source
"MyActivity.class.getName();"
. J'ai toujours pensé que "TAG" était juste un espace réservé dans les exemples de Google etc ... pas une vraieStatic
variable! C'est une bien meilleure solution merci :)this.getClass().getName()
place pour le rendre plus générique?Je crée généralement une
App
classe qui se trouve dans un package différent et contient des méthodes statiques utiles. Une des méthodes est unegetTag()
méthode, de cette façon je peux obtenir le TAG partout.App
la classe ressemble à ceci:EDIT : Amélioration du commentaire par br mob (Merci :))
Et quand je veux l'utiliser:
La sortie de la
getTag
méthode est le nom de la classe de l'appelant (avec le nom du package), et le numéro de ligne d'oùgetTag
est appelé, pour un débogage facile.la source
getStackTrace()
fonctionne. Mais je ne l'utiliserai pas parce que c'est cherAccédez à Android Studio -> préférence -> Modèles en direct -> AndroidLog puis sélectionnez Log.d (TAG, String) .
Dans le texte du modèle remplacer
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
avec
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Cliquez ensuite sur Modifier les variables et entrez className () dans la colonne Expression en regard de la colonne className Name .
Maintenant, lorsque vous tapez le raccourci,
logd
il mettraVous n'avez plus besoin de définir un TAG.
la source
J'aime améliorer la réponse de Yaniv si vous avez le journal dans ce format (filename.java:XX) xx numéro de ligne, vous pouvez lier le raccourci de la même manière qu'il est lié en cas d'erreur, de cette façon, je peux accéder directement à la ligne en question juste en cliquant sur le logcat
Je mets ceci dans mon application étendue pour pouvoir l'utiliser dans tous les autres fichiers
Capture d'écran:
la source
AndroidStudio a un
logt
modèle par défaut (vous pouvez taperlogt
et appuyer sur tab pour qu'il se développe en un sinppet de code). Je recommande de l'utiliser pour éviter de copier-coller la définition de TAG d'une autre classe et d'oublier de changer la classe à laquelle vous faites référence. Le modèle se développe par défaut pourprivate static final String TAG = "$CLASS_NAME$"
Pour éviter d'utiliser l'ancien nom de classe après la refactorisation, vous pouvez le remplacer par
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
N'oubliez pas de cocher le bouton "Modifier les variables" et assurez-vous que la
CLASS_NAME
variable est définie pour utiliser l'className()
expression et que "Ignorer si défini" est coché.la source
J'ai créé une classe de variables statiques, de méthodes et de classes nommées
S
.Voici la méthode de journalisation:
Il est appelé dans n'importe quelle classe car
S.L(this, whaterver_object);
ThegetClass().getName()
ajoute également le nom du package, par conséquent, je le supprime pour éviter de rendre la balise inutilement longue.Avantages:
Log.d(TAG,
toString
Log.d
jamais car je dois simplement supprimer la méthode et les emplacements de tous les journaux sont marqués en rouge.CCC
(une chaîne courte et facile à taper) afin qu'il soit facile de lister uniquement vos journaux dans le moniteur Android dans Android Studio. Parfois, vous exécutez simultanément des services ou d'autres classes. Si vous devez rechercher uniquement par nom d'activité, vous ne pouvez pas voir exactement quand une réponse de service a été obtenue, puis une action de votre activité s'est produite. Un préfixe comme CCC aide car il vous donne des journaux chronologiquement avec l'activité dans laquelle il s'est produitla source
Context ctx
parObject ctx
etctx.getClass().getName().replace(ctx.getPackageName(), "")
parctx.getClass().getSimpleName()
. De cette façon, je peux appelerS.L(Object, Object)
n'importe où (y compris dansFragment
s qui ne s'étendent pasContext
, pour l'instantce).Vous pouvez utiliser
this.toString()
pour obtenir un identifiant unique pour la classe spécifique dans laquelle vous imprimez dans le journal.la source
toString()
passe.Au détriment de la mise à jour de ces chaînes lorsque je déplace du code entre des méthodes ou que je renomme des méthodes, j'aime faire ce qui suit. Philosophiquement, il semble également préférable de conserver «emplacement» ou «contexte» dans la balise, pas dans le message.
L'avantage ici est que vous pouvez filtrer une seule méthode même si le contenu n'est pas statique, par exemple
Le seul inconvénient est que lorsque je renomme
f()
eng()
je dois garder cette chaîne à l'esprit. De plus, le refactoring automatique de l'IDE ne les attrapera pas.Pendant un moment, j'ai été fan de l'utilisation du nom de classe court, je veux dire
LOG_TAG = MyClass.class.getSimpleName()
. Je les ai trouvés plus difficiles à filtrer dans les journaux car il y avait moins à faire.la source
C'est une question très ancienne, mais même si une réponse mise à jour pour juillet 2018, il est préférable d'utiliser Timber. Afin de consigner correctement la journalisation, les erreurs et les avertissements peuvent être envoyés à des bibliothèques de plantage tierces, telles que Firebase ou Crashlytics.
Dans la classe qui implémente Application, vous devez ajouter ceci:
N'oubliez pas la dépendance du bois.
la source
Pour les utilisateurs qui visitent cette question:
la source
ils utilisent Timber pour l'application IOsched 2019 pour afficher les informations de débogage:
implementation 'com.jakewharton.timber:timber:4.7.1'
usage
notez que cela rend les journaux disponibles uniquement pendant l'état DEBUG et vous facilite la tâche de les supprimer manuellement pour le lancement sur Google Play -
consultez cet article https://medium.com/mindorks/better-logging-in-android-using-timber-72e40cc2293d
la source
J'utilise généralement le nom de la méthode comme balise mais de Thread
Cela évite la nouvelle exception.
la source
la source
RuntimeException
juste pour obtenir le nom de la classe actuelle? Très mauvais.this.getClass().getName()
bien que vous deviez supprimer la portée statique duTAG