Comment étiquetez-vous habituellement les entrées du journal? (Android)

Je suppose que la plupart d’entre vous connaissent android.util.Log. Toutes les méthodes de journalisation acceptent le «tag de chaîne» comme premier argument.

Et ma question est: Comment est- ce que vous marquez habituellement vos journaux dans vos applications? J’ai vu du hardcode comme ceci:

public class MyActivity extends Activity { private static final Ssortingng TAG = "MyActivity"; //... public void method () { //... Log.d(TAG, "Some logging"); } } 

Cela n’a pas l’air sympa pour plusieurs raisons:

  • Vous pouvez me dire que ce code n’a pas de code dur, mais c’est le cas.
  • Mon application peut contenir un nombre quelconque de classes dans des packages différents portant le même nom. Il serait donc difficile de lire le journal.
  • Ce n’est pas flexible. Vous avez toujours placé un TAG de champ privé dans votre classe.

Existe-t-il un moyen pratique d’obtenir un TAG pour une classe?

J’utilise un TAG, mais je l’initialise comme ceci:

 private static final Ssortingng TAG = MyActivity.class.getName(); 

De cette façon, quand je refactore mon code, la balise changera également en conséquence.

Je crée généralement une classe App qui se trouve dans un package différent et contient des méthodes statiques utiles. Une des méthodes est une méthode getTag() , de cette façon je peux obtenir le TAG partout.
App classe d’ App ressemble à ceci:

EDIT : Amélioration du commentaire par br br (Merci :))

 public class App { public static Ssortingng getTag() { Ssortingng tag = ""; final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); for (int i = 0; i < ste.length; i++) { if (ste[i].getMethodName().equals("getTag")) { tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")"; } } return tag; } } 

Et quand je veux l'utiliser:

 Log.i(App.getTag(), "Your message here"); 

Le résultat de la méthode getTag est le nom de la classe appelante (avec le nom du package) et le numéro de la ligne à partir de laquelle getTag est appelé pour un débogage facile.

Accédez à Android Studio -> preference -> Live Templates -> AndroidLog, puis sélectionnez Log.d (TAG, Ssortingng) .

Dans le texte du modèle, remplacer

android.util.Log.d(TAG, "$METHOD_NAME$: $content$");

avec

android.util.Log.d("$className$", "$METHOD_NAME$: $content$");

Image du menu Android

Cliquez ensuite sur Modifier les variables et entrez className () dans la colonne Expression en regard de la colonne Nom de className. image du menu Android 2

Maintenant, lorsque vous tapez le raccourci logd il va mettre

 Log.d("CurrentClassName", "currentMethodName: "); 

Vous n’avez plus besoin de définir un TAG.

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 que vous pouvez lier au raccourci de la même manière quand il y a une erreur, de cette façon je peux accéder directement à la ligne en question juste en cliquant sur le logcat

Je mets cela dans mon application étendue afin que je puisse utiliser dans tous les autres fichiers

 public static Ssortingng getTag() { Ssortingng tag = ""; final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); for (int i = 0; i < ste.length; i++) { if (ste[i].getMethodName().equals("getTag")) { tag = "("+ste[i + 1].getFileName() + ":" + ste[i + 1].getLineNumber()+")"; } } return tag; } 

Capture d'écran:

J’ai créé une classe de variables statiques, méthodes et classes nommées S

Voici la méthode de journalisation:

 public static void L(Context ctx, Object s) { Log.d("CCC " + ctx.getClass().getName().replace(ctx.getPackageName(), ""), s.toSsortingng()); } 

Il est appelé dans n’importe quelle classe comme SL(this, whaterver_object); Le getClass().getName() ajoute également le nom du package, par conséquent, je le supprime pour éviter de rendre la balise inutilement longue.

Avantages:

  1. Plus court que Log.d(TAG,
  2. Pas besoin de convertir les valeurs int en leur chaîne. Enfait pas besoin de taper toSsortingng
  3. N’oubliez pas de supprimer Log.d comme je dois juste supprimer la méthode et les emplacements de tous les journaux sont marqués en rouge.
  4. Pas besoin de définir le TAG en haut de l’activité car il prend le nom de la classe.
  5. Le TAG a un préfixe de CCC (une chaîne courte, facile à taper) de sorte qu’il est facile de ne lister que vos journaux dans Android Monitor dans Android Studio. Parfois, vous exécutez des services ou d’autres classes simultanément. Si vous devez rechercher uniquement le nom de l’activité, vous ne pouvez pas voir exactement quand une réponse au service a été obtenue et qu’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 produit

Au désortingment de la mise à jour de ces chaînes lorsque je déplace le code entre les méthodes ou que je renomme les méthodes, j’aime faire ce qui suit. Philosophiquement, il semble également préférable de conserver “emplacement” ou “contexte” dans l’étiquette, pas dans le message.

 public class MyClass { // note this is ALWAYS private...subclasses should define their own private static final LOG_TAG = MyClass.class.getName(); public void f() { Log.i(LOG_TAG + ".f", "Merry Christmas!"); } } 

L’avantage ici est que vous pouvez filtrer une seule méthode même si le contenu n’est pas statique, par exemple

 Log.i(LOG_TAG + ".f", Ssortingng.valueOf(new Random().nextInt())); 

Le seul inconvénient est que lorsque je renomme f() en g() je dois garder cette chaîne à l’esprit. En outre, le refactoring automatique de l’IDE ne les détectera pas.

Pendant un moment j’étais fan de l’utilisation du nom de classe abrégé, je veux dire LOG_TAG = MyClass.class.getSimpleName() . Je les ai trouvés plus difficiles à filtrer dans les journaux car il y avait moins de choses à faire.

AndroidStudio a un modèle de logt par défaut (vous pouvez taper logt et appuyer sur la touche tab pour le développer en sinppet de code). Je recommande d’utiliser ceci pour éviter de copier la définition TAG d’une autre classe et d’oublier de changer la classe à laquelle vous faites référence. Le modèle s’étend par défaut à

private static final Ssortingng TAG = "$CLASS_NAME$"

Pour éviter d’utiliser l’ancien nom de classe après le refactoring, vous pouvez changer cela en

private static final Ssortingng TAG = $CLASS_NAME$.class.getSimpleName();

N’oubliez pas de cocher le bouton “Modifier les variables” et assurez-vous que la variable CLASS_NAME est définie pour utiliser l’expression className() et que l’ CLASS_NAME “Ignorer si défini” est cochée.

Vous pouvez utiliser this.toSsortingng() pour obtenir un identifiant unique pour la classe spécifique dans laquelle vous imprimez dans le journal.

C’est une question très ancienne, mais même en pensant à une réponse mise à jour pour juillet 2018, il est préférable d’utiliser Timber. Pour consigner la journalisation correcte, les erreurs et les avertissements peuvent être envoyés à des bibliothèques de blocage tierces, telles que Firebase ou Crashlytics.

Dans la classe qui implémente Application, vous devez append ceci:

 @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); } else { Timber.plant(new CrashReportingTree()); } } /** A tree which logs important information for crash reporting. */ private static class CrashReportingTree extends Timber.Tree { @Override protected void log(int priority, Ssortingng tag, Ssortingng message, Throwable t) { if (priority == Log.VERBOSE || priority == Log.DEBUG) { return; } FakeCrashLibrary.log(priority, tag, message); if (t != null) { if (priority == Log.ERROR) { FakeCrashLibrary.logError(t); } else if (priority == Log.WARN) { FakeCrashLibrary.logWarning(t); } } } } 

N’oubliez pas la dépendance au bois.

 implementation 'com.jakewharton.timber:timber:4.7.1' 

J’utilise habituellement le nom de la méthode comme tag mais de Thread

 Ssortingng TAG = Thread.currentThread().getStackTrace()[1].getMethodName(); 

Cela évite la nouvelle exception.

 private static final Ssortingng TAG = new RuntimeException().getStackTrace()[0].getClassName();