J'ai beaucoup d'instructions de journalisation à déboguer par exemple.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
lors du déploiement de cette application sur le téléphone de l'appareil, je souhaite désactiver la journalisation détaillée à partir de laquelle je peux activer / désactiver la journalisation.
Réponses:
Une méthode courante consiste à créer un int nommé loglevel et à définir son niveau de débogage en fonction du niveau de journalisation.
Plus tard, vous pouvez simplement changer le LOGLEVEL pour tous les niveaux de sortie de débogage.
la source
La documentation Android dit ce qui suit à propos des niveaux de journal :
Vous pouvez donc envisager de supprimer le journal des instructions de déconnexion verbeuses , éventuellement en utilisant ProGuard comme suggéré dans une autre réponse .
Selon la documentation, vous pouvez configurer la journalisation sur un périphérique de développement à l'aide des propriétés système. La propriété est à jeu
log.tag.<YourTag>
et il doit être réglé sur l' une des valeurs suivantes:VERBOSE
,DEBUG
,INFO
,WARN
,ERROR
,ASSERT
ouSUPPRESS
. Plus d'informations à ce sujet sont disponibles dans la documentation duisLoggable()
méthode.Vous pouvez définir temporairement les propriétés à l'aide de la
setprop
commande. Par exemple:Vous pouvez également les spécifier dans le fichier '/data/local.prop' comme suit:
Les versions ultérieures d'Android semblent exiger que /data/local.prop soit en lecture seule . Ce fichier est lu au démarrage, vous devrez donc redémarrer après l'avoir mis à jour. Si
/data/local.prop
monde est accessible en écriture, il sera probablement ignoré.Enfin, vous pouvez les définir par programme à l'aide de la
System.setProperty()
méthode .la source
android.util.Config
constantes obsolètes. Les valeurs codées en dur spécifiées dans la documentation de l'API sont inutiles car elles varient (supposément) selon la version. Par conséquent, la route ProGuard nous a semblé la meilleure solution.Le moyen le plus simple est probablement d'exécuter votre JAR compilé via ProGuard avant le déploiement, avec une configuration comme:
Cela supprimera - à part toutes les autres optimisations de ProGuard - toutes les instructions de journal détaillées directement du bytecode.
la source
J'ai pris une route simple - créer une classe wrapper qui utilise également des listes de paramètres variables.
la source
Le meilleur moyen est d'utiliser l'API SLF4J + une partie de son implémentation.
Pour les applications Android, vous pouvez utiliser les éléments suivants:
la source
logback-android
(car lelogback
bon est incompatible).logback-android-1.0.10-1.jar
est de 429 Ko, ce qui n'est pas trop mal compte tenu des fonctionnalités fournies, mais la plupart des développeurs utiliseraient de toute façon Proguard pour optimiser leur application.Tu devrais utiliser
la source
Suppression de la journalisation avec proguard (voir la réponse de @Christopher) était facile et rapide, mais cela faisait que les traces de pile de la production ne correspondaient pas à la source s'il y avait une journalisation de débogage dans le fichier.
Au lieu de cela, voici une technique qui utilise différents niveaux de journalisation dans le développement par rapport à la production, en supposant que proguard est utilisé uniquement en production. Il reconnaît la production en voyant si proguard a renommé un nom de classe donné (dans l'exemple, j'utilise "com.foo.Bar" - vous le remplaceriez par un nom de classe complet dont vous savez qu'il sera renommé par proguard).
Cette technique utilise la journalisation commune.
la source
Log4j ou slf4j peuvent également être utilisés comme cadres de journalisation dans Android avec logcat. Voir le support du projet android-logging-log4j ou log4j sous android
la source
Il existe un petit remplacement pour la classe standard Android Log - https://github.com/zserge/log
En gros, tout ce que vous avez à faire est de remplacer les importations de
android.util.Log
àtrikita.log.Log
. Ensuite, dans votreApplication.onCreate()
ou dans un initalizer statique, vérifiez leBuilConfig.DEBUG
ou tout autre indicateur et utilisezLog.level(Log.D)
ouLog.level(Log.E)
pour modifier le niveau de journalisation minimal. Vous pouvez utiliserLog.useLog(false)
pour désactiver la journalisation.la source
Vous pouvez peut-être voir cette classe d'extension de journal: https://github.com/dbauduin/Android-Tools/tree/master/logs .
Il vous permet d'avoir un contrôle fin sur les logs. Vous pouvez par exemple désactiver tous les journaux ou uniquement les journaux de certains packages ou classes.
De plus, il ajoute des fonctionnalités utiles (par exemple, vous n'avez pas à passer une balise pour chaque journal).
la source
J'ai créé un utilitaire / wrapper qui résout ce problème + d'autres problèmes courants autour de la journalisation.
Un utilitaire de débogage avec les fonctionnalités suivantes:
Comment utiliser?
J'ai essayé de rendre la documentation autonome.
Les suggestions pour améliorer cet utilitaire sont les bienvenues.
Libre à utiliser / partager.
Téléchargez-le depuis GitHub .
la source
Voici une solution plus complexe. Vous obtiendrez une trace complète de la pile et la méthode toString () ne sera appelée que si nécessaire (Performance). L'attribut BuildConfig.DEBUG aura la valeur false en mode production afin que tous les journaux de trace et de débogage soient supprimés. Le compilateur de points chauds a la possibilité de supprimer les appels car les propriétés statiques finales sont désactivées.
utiliser comme ceci:
la source
Dans un scénario de journalisation très simple, où vous essayez littéralement d'écrire sur la console pendant le développement à des fins de débogage, il peut être plus facile de simplement faire une recherche et un remplacement avant votre génération de production et commenter tous les appels à Log ou System. out.println.
Par exemple, en supposant que vous n'ayez pas utilisé le "Journal". n'importe où en dehors d'un appel à Log.d ou Log.e, etc., vous pouvez simplement effectuer une recherche et un remplacement sur l'ensemble de la solution pour remplacer «Log». avec "// Log." pour commenter tous vos appels de journalisation, ou dans mon cas, j'utilise juste System.out.println partout, donc avant de passer à la production, je vais simplement faire une recherche complète et remplacer "System.out.println" et remplacer par "//System.out.println".
Je sais que ce n'est pas idéal, et ce serait bien si la possibilité de trouver et de commenter les appels à Log et System.out.println était intégrée à Eclipse, mais jusqu'à ce que cela se produise, le moyen le plus simple et le plus rapide de le faire est pour commenter par recherche et remplacement. Si vous faites cela, vous n'avez pas à vous soucier de la non-concordance des numéros de ligne de trace de pile, car vous éditez votre code source et vous n'ajoutez aucune surcharge en vérifiant une configuration de niveau de journal, etc.
la source
Dans mes applications, j'ai une classe qui encapsule la classe Log qui a un var booléen statique appelé "state". Tout au long de mon code, je vérifie la valeur de la variable "état" en utilisant une méthode statique avant d'écrire réellement dans le journal. J'ai ensuite une méthode statique pour définir la variable "état" qui garantit que la valeur est commune à toutes les instances créées par l'application. Cela signifie que je peux activer ou désactiver toute la journalisation de l'application en un seul appel, même lorsque l'application est en cours d'exécution. Utile pour les appels de support ... Cela signifie que vous devez vous en tenir à vos armes lors du débogage et ne pas reculer pour utiliser la classe Log standard cependant ...
Il est également utile (pratique) que Java interprète une variable booléenne comme fausse si aucune valeur ne lui a été attribuée, ce qui signifie qu'elle peut rester fausse jusqu'à ce que vous deviez activer la journalisation :-)
la source
Nous pouvons utiliser la classe
Log
dans notre composant local et définir les méthodes comme v / i / e / d. Basé sur le besoin de nous pouvons faire appel plus loin.l'exemple est montré ci-dessous.
ici le message est pour
string
et etargs
est la valeur que vous souhaitez imprimer.la source
Pour moi, il est souvent utile de pouvoir définir différents niveaux de journalisation pour chaque TAG.
J'utilise cette classe wrapper très simple:
Maintenant, définissez simplement le niveau de journalisation par TAG au début de chaque classe:
la source
Une autre façon consiste à utiliser une plate-forme de journalisation qui a les capacités d'ouvrir et de fermer les journaux. Cela peut parfois donner beaucoup de flexibilité, même sur une application de production, quels journaux doivent être ouverts et lesquels sont fermés en fonction des problèmes que vous rencontrez, par exemple:
la source