web-dev-qa-db-fra.com

Comment définir différents niveaux pour différents gestionnaires de journaux python

J'ai lu quelques articles à ce sujet mais je suis toujours confus. J'ai cette configuration de journalisation:

import logging

class MongoHandler(logging.Handler):
    def __init__(self):
        logging.Handler.__init__(self)
        from pymongo import Connection
        self.db = Connection('db_server').db_name

    def emit(self, record):
        try:
            self.db.Logging.save(record.__dict__)
        except:
            print 'Logging Error:  Unable to save log entry to db'

mh = MongoHandler()
sh = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(threadName)s - %(levelname)s - %(message)s')
sh.setFormatter(formatter)
log = logging.getLogger('DeviceMonitor_%s' % hostname)
log.addHandler(mh)
log.addHandler(sh)
log.setLevel(logging.INFO)

Je veux pouvoir définir un niveau différent pour StreamHandler et MongoHandler. Est-ce possible ou dois-je avoir un deuxième enregistreur de journaux?

43
MFB

Vous pouvez définir un niveau de journalisation différent pour chaque gestionnaire de journalisation, mais il semble que vous devrez définir le niveau du consignateur sur "le plus bas". Dans l'exemple ci-dessous, je règle l'enregistreur sur DEBUG, le gestionnaire de flux sur INFO et le gestionnaire TimedRotatingFileHandler sur DEBUG. Donc, le fichier a des entrées DEBUG et le flux ne sort que INFO. Vous ne pouvez pas diriger uniquement DEBUG vers un seul et unique INFO vers un autre gestionnaire. Pour cela, vous aurez besoin d'un autre enregistreur.

logger = logging.getLogger("mylog")
formatter = logging.Formatter('%(asctime)s | %(name)s |  %(levelname)s: %(message)s')
logger.setLevel(logging.DEBUG)

stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)

logFilePath = "my.log"
file_handler = logging.handlers.TimedRotatingFileHandler(filename = logFilePath, when = 'midnight', backupCount = 30)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.DEBUG)

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.info("Started");
try:
    x = 14
    y = 0
    z = x / y
except Exception as ex:
    logger.error("Operation failed.")
    logger.debug("Encountered {0} when trying to perform calculation.".format(ex))

logger.info("Ended");
63
GrantVS

Un ajout à la réponse de GrantVS:

Je devais utiliser

logging.basicConfig(level=logging.DEBUG)

pour que cela fonctionne. Sinon bonne réponse, merci!

Mario

PS: Pour une raison quelconque, le système ne me permet pas de commenter directement la réponse de GrantVS.

4
Mario

J'avais besoin d'un temps pour comprendre le point

  1. Définissez le enregistreur général ci-dessous vos subloggers (gestionnaires) (votre résultat de logging.getLogger ())
  2. Définissez les niveaux de vos subloggers sur un niveau égal ou supérieur à votre enregistreur général 
1
Pipo