448 votes

configuration du consignateur pour enregistrer dans un fichier et imprimer sur une sortie standard

J'utilise le module de journalisation de Python pour consigner des chaînes de débogage dans un fichier qui fonctionne plutôt bien. De plus, j'aimerais utiliser ce module pour imprimer également les chaînes sur la sortie standard. Comment puis-je faire cela? Afin de connecter mes chaînes dans un fichier, j'utilise le code suivant:

 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 appelez une fonction logger comme

 logger.debug("I am written to the file")
 

Merci pour l'aide ici!

550voto

Waterboy Points 506

Juste obtenir un handle vers la racine de l'enregistreur, et ajouter le StreamHandler. Le StreamHandler écrit sur la sortie stderr. Vous ne savez pas si vous avez vraiment besoin sur stdout stderr, mais c'est ce que j'utilise lorsque j'ai installé le logger de Python et j'ai aussi ajouter le FileHandler. Alors tous mes journaux aller à deux endroits (qui est ce que ça sonne comme vous voulez).

import logging
logging.getLogger().addHandler(logging.StreamHandler())

Vous pouvez également ajouter un module de Formatage de la pour tous vos lignes de log ont un en-tête commun.

c'est à dire:

import logging
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
rootLogger = logging.getLogger()

fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)

consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)

Des tirages au format de:

2012-12-05 16:58:26,618 [MainThread  ] [INFO ]  my message

82voto

Hazok Points 825

L'ajout d'un StreamHandler sans arguments va à stderr au lieu de stdout. Si un autre processus a une dépendance sur le vidage de stdout (c'est-à-dire lors de l'écriture d'un plug-in NRPE), assurez-vous de spécifier explicitement stdout, sinon vous pourriez rencontrer des problèmes inattendus.

Voici un exemple rapide en réutilisant les valeurs supposées et LOGFILE de la question:

 import logging
import sys

log = logging.getLogger('')
log.setLevel(logging.DEBUG)
format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

ch = logging.StreamHandler(sys.stdout)
ch.setFormatter(format)
log.addHandler(ch)

fh = logging.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7)
fh.setFormatter(format)
log.addHandler(fh)
 

19voto

Silas Ray Points 11950

Exécutez basicConfig avec stream=sys.stdout comme argument avant de configurer d’autres gestionnaires ou de consigner des messages, ou ajoutez manuellement un StreamHandler qui place les messages dans la sortie standard enregistreur racine (ou tout autre enregistreur que vous voulez, d'ailleurs).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X