J'utilise le module de journalisation de Python pour consigner certaines chaînes de débogage dans un fichier qui fonctionne plutôt bien. Maintenant, en plus, j'aimerais utiliser ce module pour imprimer également les chaînes sur stdout. Comment puis-je faire cela? Pour enregistrer mes chaînes dans un fichier, j'utilise le code suivant:
import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
puis appeler une fonction d'enregistrement comme
logger.debug("I am written to the file")
Merci pour votre aide ici!
StreamHandler
avecsys.stdout
, puis il se connectera à cela au lieu de stderr.import sys
abord. Et réellement initialiser le gestionnaire, c'estconsoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
si vous essayez de voir des messages d'information ou de débogagelogging.basicConfig()
peut prendre un argument mot-cléhandlers
depuis Python 3.3, ce qui simplifie beaucoup la configuration de la journalisation, en particulier lors de la configuration de plusieurs gestionnaires avec le même formateur:L'ensemble de la configuration peut donc se faire avec un seul appel comme celui-ci:
(Ou avec
import sys
+StreamHandler(sys.stdout)
par les exigences de la question d'origine - la valeur par défaut pour StreamHandler est d'écrire sur stderr. Regardez les attributs LogRecord si vous souhaitez personnaliser le format du journal et ajouter des choses comme le nom de fichier / la ligne, les informations sur le fil, etc.)La configuration ci-dessus doit être effectuée une seule fois vers le début du script. Vous pouvez utiliser la journalisation de tous les autres endroits de la base de code plus tard, comme ceci:
Remarque: Si cela ne fonctionne pas, quelqu'un d'autre a probablement déjà initialisé le système d'enregistrement différemment. Les commentaires suggèrent de faire
logging.root.handlers = []
avant l'appel àbasicConfig()
.la source
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Cela signifie que lorsque vous souhaitez simplement vous connecter au même dossier, vous pouvez simplement l'utiliserFileHandler("mylog.log")
. Si vous souhaitez écraser le journal à chaque fois, définissez "w" comme deuxième argument.logging.root.handlers = []
avant l'appel àbasicConfig
, jetez un oeil à la fonction - c'est ennuyeux.L'ajout d'un StreamHandler sans arguments va à stderr au lieu de stdout. Si un autre processus dépend du vidage stdout (c'est-à-dire lors de l'écriture d'un plugin NRPE), assurez-vous de spécifier explicitement stdout ou vous pourriez rencontrer des problèmes inattendus.
Voici un exemple rapide de réutilisation des valeurs supposées et LOGFILE de la question:
la source
Exécutez
basicConfig
avecstream=sys.stdout
comme argument avant de configurer d'autres gestionnaires ou de consigner tous les messages, ou ajoutez manuellement unStreamHandler
qui pousse les messages vers la sortie standard vers l'enregistreur racine (ou tout autre enregistreur souhaité, d'ailleurs).la source
Après avoir utilisé le code de Waterboy à plusieurs reprises dans plusieurs packages Python, je l'ai finalement converti en un petit package Python autonome, que vous pouvez trouver ici:
https://github.com/acschaefer/duallog
Le code est bien documenté et facile à utiliser. Téléchargez simplement le
.py
fichier et incluez-le dans votre projet, ou installez l'ensemble du package viapip install duallog
.la source
Connexion à
stdout
etrotating file
avec différents niveaux et formats:la source
Voici une solution complète et bien emballée basée sur la réponse de Waterboy et diverses autres sources. Il prend en charge la journalisation à la fois sur la console et le fichier journal, permet différents paramètres de niveau de journal, fournit une sortie colorisée et est facilement configurable (également disponible sous forme de Gist ):
la source
Pour 2.7, essayez ce qui suit:
la source