【问题标题】:Python "root" loglevel and levels of other handlersPython“根”日志级别和其他处理程序的级别
【发布时间】:2014-07-03 01:20:56
【问题描述】:

我有一个脚本,我试图在其中选择将各种内容(可选)记录到控制台和日志文件。我还希望能够为任一日志目标设置不同的日志级别,即日志文件的调试和控制台的信息。

我已经通过启动一个“根”记录器,然后可以选择为这个记录器创建不同的处理程序,在这些处理程序中我可以独立设置日志级别。但是,我担心这需要将可能的最低日志级别设置为“根”记录器,即使我没有将任何处理程序设置为低级别,也许系统仍然会被一个大的日志事件的数量。

澄清一下,如果我设置 logger.setLevel(logging.WARNING),然后在 fileHandler 或 consoleHandler 中尝试使用“logging.DEBUG”,我仍然只会在我的任一日志目标中获得 WARNING 级别的日志打印.这对我来说很有意义,因为 fileHandler 和 consoleHandler 是记录器的子对象(请原谅我缺乏适当的词汇),但是我只是想确保我的“根”记录器具有尽可能低的日志级别实际上并不除非处理程序实际上也设置为低级别,否则执行任何操作。

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")

【问题讨论】:

  • 我不确定您所说的“对我的“根”记录器具有尽可能低的日志级别实际上并没有做任何事情”是什么意思。如果你担心的话,它不会在你的两个处理程序之外的任何地方记录消息。
  • 是的,我知道它不会在其他任何地方记录消息,但我会因为在 DEBUG 级别设置根记录器而在性能方面受到打击,即使我的控制台/文件处理程序也是如此设置得更高?或者实际的 stdout/write-to-file 是实际命中和不会去任何地方的日志记录(例如,如果两个处理程序都设置为 INFO 的 DEBUG 消息)并没有真正招致太多的惩罚?

标签: python logging


【解决方案1】:

来自docs

处理程序

...

setLevel() 方法,就像在记录器对象中一样,指定将被分派到适当目的地的最低严重性。为什么有两个 setLevel() 方法?记录器中设置的级别决定了它将传递给其处理程序的消息的严重性。每个处理程序中设置的级别决定了该处理程序将发送哪些消息。

【讨论】:

    【解决方案2】:

    我只是想确保对我的“根”记录器具有尽可能低的日志级别实际上不会做任何事情,除非处理程序实际上也设置为低级别。

    这不是它的工作方式。记录器的日志级别是处理程序的网关,如果您希望处理程序接收消息,则必须将其设置为最低处理程序。记录器会将所有通过其日志级别检查的消息交给其所有处理程序,并让处理程序决定是否接受。有一些开销,但对于大多数程序来说,这是微不足道的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多