J'utilise le module de journalisation de Python et je souhaite désactiver la journalisation de la console pendant un certain temps, mais cela ne fonctionne pas.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
Le code ci-dessus affiche le bla bla
sur stdout et je ne sais pas comment puis-je désactiver en toute sécurité le gestionnaire de console. Comment puis-je être sûr de supprimer temporairement la console StreamHandler et pas une autre?
logger.handlers
il doit être vide (car il précède l'logger.debug()
appel). Le code en question s'affiche uniquement[]
(liste vide de gestionnaires). Vérifié avec Python 2.7.15 et Python 3.6.6.Réponses:
J'ai trouvé une solution pour cela:
Cela empêchera la journalisation d'être envoyée à l'enregistreur supérieur qui inclut la journalisation de la console.
la source
INFO
messages), vous pouvez modifier la deuxième ligne en quelque chose commelogger.setLevel(logging.WARNING)
logging.lastResort
gestionnaire enregistrera toujours les messages de gravitélogging.WARNING
et supérieure àsys.stderr
en l'absence d'autres gestionnaires. Voyez ma réponse .J'utilise:
la source
logging
niveau du module pour désactiver complètement la journalisation , par exempleimport logging; logging.disable(logging.CRITICAL);
:: docs.python.org/2/library/logging.html#logging.disabledisabled
attribut ne fait pas partie de l'API publique. Voir bugs.python.org/issue36318 .Vous pouvez utiliser:
où your_level est l'un de ceux-ci:
Donc, si vous définissez your_level sur logging.CRITICAL , vous ne recevrez que les messages critiques envoyés par:
Définition de your_level sur logging.DEBUG affichera tous les niveaux de journalisation.
Pour plus de détails, veuillez consulter les exemples de journalisation.
De la même manière, pour modifier le niveau de chaque gestionnaire, utilisez la fonction Handler.setLevel () .
la source
(question morte depuis longtemps, mais pour les futurs chercheurs)
Plus proche du code / de l'intention de l'affiche originale, cela fonctionne pour moi sous python 2.6
Le piège que j'ai dû résoudre était de supprimer le gestionnaire stdout après en avoir ajouté un nouveau; le code de l'enregistreur semble ré-ajouter automatiquement la sortie standard si aucun gestionnaire n'est présent.
la source
logger = logging.getLogger(); lhStdout = logger.handlers[0]
est erronée car l'enregistreur racine n'a initialement aucun gestionnaire -python -c "import logging; assert not logging.getLogger().handlers"
. Vérifié avec Python 2.7.15 et Python 3.6.6.Gestionnaire de contexte
Exemple d'utilisation:
la source
Pour désactiver complètement la journalisation :
Pour activer la journalisation :
D'autres réponses fournissent des solutions de contournement qui ne résolvent pas complètement le problème, telles que
et, pour certains
n
supérieurs à 50,Le problème avec la première solution est qu'elle ne fonctionne que pour l'enregistreur racine. Les autres enregistreurs créés à l'aide, par exemple,
logging.getLogger(__name__)
ne sont pas désactivés par cette méthode.La deuxième solution affecte tous les journaux. Mais il limite la sortie à des niveaux supérieurs à ce qui est donné, donc on peut la remplacer en enregistrant avec un niveau supérieur à 50.
Cela peut être évité par
qui pour autant que je sache (après avoir examiné la source ) est le seul moyen de désactiver complètement la journalisation.
la source
Il y a de très belles réponses ici, mais apparemment la plus simple n'est pas trop prise en compte (uniquement à partir d'infinito).
Cela désactive l'enregistreur racine, et donc tous les autres enregistreurs. Je n'ai pas vraiment testé mais ça devrait être aussi le plus rapide.
À partir du code de journalisation en python 2.7, je vois ceci
Ce qui signifie que lorsqu'il est désactivé, aucun gestionnaire n'est appelé, et il devrait être plus efficace que le filtrage à une valeur très élevée ou la définition d'un gestionnaire no-op par exemple.
la source
log = logging.getLogger(__name__)
disabled
attribut ne fait pas partie de l'API publique. Voir bugs.python.org/issue36318 .Pas besoin de détourner stdout. Voici une meilleure façon de le faire:
Un moyen encore plus simple est:
la source
logging.basicConfig()
fonction (c'est moi qui souligne): Effectue une configuration de base pour le système de journalisation en créant un StreamHandler avec un formateur par défaut et en l'ajoutant à l'enregistreur racine. Les fonctions debug (), info (), warning (), error () et critical () appelleront automatiquement basicConfig () si aucun gestionnaire n'est défini pour le journal racine . - docs.python.org/3/library/logging.html#logging.basicConfigJe ne connais pas très bien le module de journalisation, mais je l'utilise de la manière dont je souhaite généralement désactiver uniquement les messages de débogage (ou d'informations). Vous pouvez utiliser
Handler.setLevel()
pour définir le niveau de journalisation sur CRITICAL ou supérieur.De plus, vous pouvez remplacer sys.stderr et sys.stdout par un fichier ouvert en écriture. Voir http://docs.python.org/library/sys.html#sys. stdout . Mais je ne recommanderais pas cela.
la source
[]
.Vous pouvez également:
la source
app.logger
ce que vous ne spécifiez même pas à la place de l'enregistreur racine explicitement mentionné dans la question (logging.getLogger()
) et la plupart des réponses? Comment savez-vous que vous pouvez modifier en toute sécurité lahandlers
propriété au lieu d'appeler laLogger.addHandler
méthode?Sortie de la console:
Contenu du fichier test.log:
la source
En changeant un niveau dans le "logging.config.dictConfig", vous serez en mesure de porter tout le niveau de journalisation à un nouveau niveau.
})
la source
Trouvé une solution élégante utilisant des décorateurs , qui résout le problème suivant: que se passe-t-il si vous écrivez un module avec plusieurs fonctions, chacune avec plusieurs messages de débogage, et que vous voulez désactiver la journalisation dans toutes les fonctions sauf celle sur laquelle vous vous concentrez actuellement?
Vous pouvez le faire en utilisant des décorateurs:
Ensuite, vous pouvez faire:
Même si vous appelez
function_already_debugged
de l'intérieurfunction_being_focused
, les messages de débogage defunction_already_debugged
ne seront pas affichés. Cela garantit que vous ne verrez que les messages de débogage de la fonction sur laquelle vous vous concentrez.J'espère que ça aide!
la source
Si vous souhaitez désactiver temporairement un certain enregistreur, voici ce qui est fait.
Exemple de journal
Code
la source
Dans la bibliothèque Logging Python, on peut désactiver complètement la journalisation (pour tous les niveaux) pour un enregistreur particulier en effectuant l'une des opérations suivantes:
Ajouter au journal un
logging.NullHandler()
gestionnaire (pour empêcher lelogging.lastResort
gestionnaire de consigner les événements de gravitélogging.WARNING
et supérieure àsys.stderr
) et définir l'propagate
attribut de ce journal surFalse
(pour empêcher le journal de transmettre les événements aux gestionnaires de ses enregistreurs ancêtres).Utilisation de l'API principale:
En utilisant l'API de configuration:
Ajout d'un
lambda record: False
filtre à l'enregistreur .Utilisation de l'API principale:
En utilisant l'API de configuration:
Avertissement. - Contrairement à la 1ère solution, la 2ème solution ne désactive pas la journalisation des enregistreurs enfants (par exemple
logging.getLogger("foo.bar")
), il ne faut donc l'utiliser que pour désactiver la journalisation pour un seul enregistreur.Remarque. - La définition de l'
disabled
attribut de l'enregistreur surTrue
n'est pas une troisième solution, car elle ne fait pas partie de l'API publique. Voir https://bugs.python.org/issue36318 :la source
sous-classez le gestionnaire que vous souhaitez pouvoir désactiver temporairement:
trouver le gestionnaire par son nom est assez simple:
une fois trouvé:
la source