如何为不同的python日志处理程序设置不同的级别

MFB*_*MFB 56 python logging

我已经阅读了一些关于此的帖子,但我仍然感到困惑.我有这个日志设置:

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)
Run Code Online (Sandbox Code Playgroud)

我希望能够为StreamHandler和MongoHandler设置不同的级别.这可能还是我需要第二个Logger obj?

Gra*_*tVS 74

您可以为每个日志记录处理程序设置不同的日志记录级别,但似乎您必须将记录器的级别设置为"最低".在下面的示例中,我将记录器设置为DEBUG,将流处理程序设置为INFO,将TimedRotatingFileHandler设置为DEBUG.因此该文件具有DEBUG条目,并且流仅输出INFO.您不能仅将DEBUG指向一个且仅将INFO指向另一个处理程序.为此你需要另一个记录器.

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");
Run Code Online (Sandbox Code Playgroud)

  • 是的,关键是将 `logger` 设置为 `logging.DEBUG` 级别,以便处理程序可以从该级别进行过滤,否则默认情况下一切都来自 `logging.WARNING` 级别。 (3认同)
  • ifelsemonkey,导入logging.handlers应该引入那些缺少的处理程序。 (2认同)

Pip*_*ipo 7

我需要时间来理解这一点

  1. 您的子记录器(处理程序)下方设置通用记录器(您的 logging.getLogger() 结果)
  2. 将您的子记录器级别设置为与一般记录器相同或更高的级别

  • [此](https://www.electricmonk.nl/log/2017/08/06/understanding-pythons-logging-module/)文章帮助我理解了这个答案背后的逻辑 (3认同)

Mar*_*rio 6

GrantVS 答案的补充:

我不得不使用

logging.basicConfig(level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

为了让它工作。否则很好的答案,谢谢!

马里奥

PS:出于某种原因,系统不允许我直接评论 GrantVS 的回答。