Python "根"日志级别及其他处理器的级别

2 投票
2 回答
1995 浏览
提问于 2025-04-18 06:35

我有一个脚本,想要实现一个功能,可以选择性地把各种信息同时记录到控制台和日志文件里。我还希望能为这两个记录的地方设置不同的日志级别,比如把DEBUG级别的日志记录到文件里,而把INFO级别的日志记录到控制台。

我已经实现了这个功能,方法是先创建一个“根”日志记录器,然后可以选择性地为这个记录器创建不同的处理器,在这些处理器里我可以独立设置日志级别。不过,我有点担心,这样做会要求“根”记录器的最低日志级别设置得很低,即使我不为低级别设置任何处理器,系统可能还是会因为大量的日志事件而变得很慢。

为了更清楚地说明,如果我设置logger.setLevel(logging.WARNING),然后在fileHandler或consoleHandler里使用'logging.DEBUG',我在这两个日志记录地方都只会看到WARNING级别的日志输出。我理解这是因为fileHandler和consoleHandler是logger的子对象(抱歉我用词不太准确),但我还是想确认一下,把“根”记录器的最低日志级别设置得很低,实际上不会有什么影响,除非有处理器也设置为低级别。

import logging
import logging.handlers

LOG_TO_STDOUT = 1
ENABLE_LOGFILE = 1

logFormatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
### DO NOT CHANGE main logger log level. This sets the lowest log level available for other loggers
logger.setLevel(logging.DEBUG)

if ENABLE_LOGFILE == 1:
    fileHandler = logging.handlers.RotatingFileHandler('crisco.log', maxBytes=2000, backupCount = 5)
    fileHandler.setFormatter(logFormatter)

    ### Set logfile log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
    fileHandler.setLevel(logging.DEBUG)

    logger.addHandler(fileHandler)

if LOG_TO_STDOUT == 1:
    consoleHandler = logging.StreamHandler()
    consoleHandler.setFormatter(logFormatter)

    ### Set console log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
    consoleHandler.setLevel(logging.INFO)

    logger.addHandler(consoleHandler)

logger.info("this message should show both in file and console")
logger.debug("this message should be in the file only")

2 个回答

2

我只是想确认一下,把我的“根”日志记录器的日志级别设置得越低越好,是否真的没有任何作用,除非处理程序也设置为低级别。

其实不是这样的。日志记录器的日志级别就像是通往处理程序的门槛,只有当它的级别设置得和最低的处理程序一样低时,处理程序才能收到消息。日志记录器会把所有通过它的日志级别检查的消息传递给所有的处理程序,然后让处理程序决定是否处理这些消息。虽然这样会有一些额外的开销,但对于大多数程序来说,这种影响是微不足道的。

2

来自于 文档

处理器

...

setLevel() 方法和日志记录器的对象一样,指定了将发送到相应目的地的最低严重性等级。为什么会有两个 setLevel() 方法呢?在日志记录器中设置的等级决定了它会把哪些严重性等级的消息传递给它的处理器。而在每个处理器中设置的等级决定了这个处理器会发送哪些消息。

撰写回答