Comment avez-vous l'habitude de Balise entrées de journal? (android)
Je suppose que la plupart d'entre vous sont au courant de android.util.Journal
Toutes les méthodes de journalisation accepter 'String tag" en tant que premier argument.
Et ma question est la Comment avez-vous l'habitude de la balise de vos journaux dans vos applications?
J'ai vu quelques coder en dur comme ceci:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Ce n'est pas agréable à regarder pour de nombreuses raisons:
- Vous pouvez me dire ce code n'a pas coder en dur, mais il le fait.
- Ma demande pourrait avoir n'importe quel nombre de classes dans les packages différents avec le même nom. De sorte qu'il serait difficile de lire le journal.
- Il n'est pas flexible. Vous avez toujours mettre un champ privé de la BALISE dans votre classe.
Est-il de toute façon soignée pour obtenir une ÉTIQUETTE de classe?
- À l'aide de la BALISE est proposé par Android javadoc, donc je ne pense pas que c'est pire que de se nom de la classe au moment de l'exécution
- je préfère créer une classe spécifique, comme GeneralConstants et de mettre mes TAGs sur lui et je peux atteindre mes balises de toute la classe que je veux comme ça; GeneralConstans.MY_TAG
- Je pense que c'est mieux d'avoir l'ÉTIQUETTE définie dans la classe, coder en dur le nom de la classe, c'est moche, mais le seul moyen fiable pour travailler avec proguard. Si vous n'utilisez jamais proguard puis MyActivity.classe.getName() est la meilleure solution. Si vous êtes inquiet au sujet de la duplication de noms suffit d'inclure le nom du package. Avoir des noms de balises dans un autre endroit deviendra un entretien cauchemar.
- Certaines de journalisation et de l'outil de débogage Android androidwave.com/useful-tools-for-logging-debugging-in-android
Vous devez vous connecter pour publier un commentaire.
- Je utiliser une BALISE, mais je l'initialiser comme ceci:
De cette façon, lorsque je refactoriser mon code de la balise va aussi changer en conséquence.
"MyActivity.class.getName();"
. J'ai toujours pensé que "TAG" est tout simplement un espace réservé dans les exemples de Google etc... n'est pas une véritableStatic
variable! C'est une bien meilleure solution merci 🙂this.getClass().getName()
au lieu de le rendre plus générique?J'ai l'habitude de créer un
App
classe qui se trouve dans un package différent et contient des méthodes statiques. L'une des méthode est ungetTag()
méthode, de cette façon je peux obtenir de la BALISE de partout.App
classe ressemble à ceci:MODIFIER: Amélioration par br foule de commentaires ( Merci 🙂 )
Et quand je veux l'utiliser:
La sortie de la
getTag
méthode est le nom de l'appelant classe (avec le nom du paquet), et le numéro de ligne où l'getTag
est appelé, pour faciliter le débogage.getStackTrace()
œuvres. Mais je ne vais pas l'utiliser parce que son cherAller à Android Studio -> préférences -> Live Templates -> AndroidLog puis sélectionnez Journal.d(TAG, String).
Dans Modèle de texte remplacer
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
avec
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Puis cliquez sur Modifier les variables et entrez className() dans le Expression colonne à côté de celui de la classe Nom colonne.
Maintenant, lorsque vous tapez le raccourci
logd
il mettraVous n'avez pas besoin de définir une BALISE de plus.
J'aime à améliorer Yaniv répondre
si vous avez le journal de ce format (nom de fichier.java:XX) xx numéro de ligne vous pouvez lier le raccourci de la même façon obtient lié quand il y a une erreur, de cette façon je peux obtenir directement à la ligne en question juste par un clic sur le logcat
Je l'ai mis à l'intérieur de mon extension de l'Application, de sorte que je peux utiliser dans tous les autres fichier
Capture d'écran:
J'ai créé une classe de variables Statiques, les méthodes et les classes nommées comme
S
.Ce qui suit est la méthode de journalisation:
Il est appelé dans une catégorie comme
S.L(this, whaterver_object);
LagetClass().getName()
ajoute également le nom du paquet, donc, je suis retrait pour éviter de faire de la balise inutilement long.Avantages:
Log.d(TAG,
toString
Log.d
jamais comme je viens de supprimer la méthode et les emplacements de tous les journaux sont marqués en rouge.CCC
(un court, facile à type string), de sorte qu'il est facile de lister uniquement les journaux de votre android à surveiller dans Android Studio. Parfois, vous êtes l'exécution de services ou d'autres classes simultanément. Si vous avez à la recherche par le nom de l'activité seul, alors vous ne pouvez pas voir exactement quand une réponse a été obtenue, puis une action de votre activité a eu lieu. Un préfixe comme la CCC aide car il vous donne les journaux chronologiquement avec l'activité dans laquelle elle s'est produiteContext ctx
parObject ctx
etctx.getClass().getName().replace(ctx.getPackageName(), "")
parctx.getClass().getSimpleName()
. De cette façon, je peux appelerS.L(Object, Object)
partout (y compris dansFragment
s qui ne s'étend pasContext
, pour instantce).Au détriment de la mise à jour de ces chaînes quand j'ai passer le code entre les méthodes ou renommer les méthodes, j'aime faire ce qui suit. Philosophiquement, il semble aussi qu'il serait préférable de garder le "lieu" ou "contexte" dans la balise, pas 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, c'est que quand je renomme
f()
àg()
j'ai besoin de garder cette chaîne à l'esprit. Aussi, automatique IDE refactoring ne prends pas ces.Pendant un moment j'ai été un fan de l'utilisation de la court nom de la classe, je veux dire
LOG_TAG = MyClass.class.getSimpleName()
. Je l'ai trouvé plus difficile à filtrer dans les journaux car il y a moins d'aller sur.AndroidStudio a un
logt
modèle par défaut (vous pouvez taperlogt
et appuyez sur tab à s'étendre à un sinppet de code) . Je recommande l'utilisation de ce pour éviter le copier-coller la BALISE de définition d'une autre classe et d'oublier de changer la classe que vous faites référence. Le modèle s'étend par défaut pourprivate static final String TAG = "$CLASS_NAME$"
Pour éviter d'utiliser l'ancien nom de la classe après le refactoring, vous pouvez modifier que pour
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
N'oubliez pas de cocher la case "Modifier les variables" et assurez-vous que le
CLASS_NAME
variable est défini pour utiliser leclassName()
Expression et a "Ignorer si l'défini" est cochée.Vous pouvez utiliser
this.toString()
pour obtenir un identifiant unique pour la classe dans laquelle vous imprimez sur le journal.toString()
n'.C'est une très vieille question, mais même pensé à une mise à jour de réponse pour le mois de juillet 2018, il est plus préférable d'utiliser du Bois. Pour vous Connecter à l'une connexion correcte, les erreurs et met en garde peut être transmis à des tiers crash bibliothèques, comme Firebase ou Crashlytics.
Dans la classe qui implémente Application vous devez ajouter ceci:
Ne pas oublier de Bois de dépendance.
Pour les utilisateurs qui visitent cette question:
J'ai l'habitude d'utiliser la méthode nom de la balise, mais à partir du Fil
Cela évite de le nouveau une Exception.
RuntimeException
juste pour obtenir l'actuel nom de la classe? Très mauvaise.this.getClass().getName()
bien que vous auriez à éliminer la statique du champ d'application de laTAG