Python“;根“;日志级别和其他处理程序的级别

Python“;根“;日志级别和其他处理程序的级别,python,logging,Python,Logging,我有一个脚本,在这个脚本中,我尝试将各种事情(可选)记录到控制台和日志文件中。我还希望能够为任一日志目标设置不同的日志级别,即调试日志文件和控制台信息 通过启动一个“根”记录器,然后可选地为该记录器创建不同的处理程序,我可以在其中独立设置日志级别,我已经实现了这一点。但是,我担心这需要为“根”记录器设置尽可能低的日志级别,即使我没有将任何处理程序设置为低级别,系统可能仍然会因大量日志事件而陷入困境 为了澄清,如果我设置logger.setLevel(logging.WARNING),然后在fil

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

通过启动一个“根”记录器,然后可选地为该记录器创建不同的处理程序,我可以在其中独立设置日志级别,我已经实现了这一点。但是,我担心这需要为“根”记录器设置尽可能低的日志级别,即使我没有将任何处理程序设置为低级别,系统可能仍然会因大量日志事件而陷入困境

为了澄清,如果我设置logger.setLevel(logging.WARNING),然后在fileHandler或consoleHandler中尝试使用“logging.DEBUG”,我仍然只会在任一日志目标中获得警告级别的日志打印。这对我来说是有意义的,因为fileHandler和consoleHandler是logger的子对象(请原谅我缺少适当的vocab),但是我只想确保将尽可能低的日志级别设置到我的“根”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")

处理程序

setLevel()方法与logger对象中的方法一样,指定将发送到相应目标的最低严重性。为什么有两个setLevel()方法?记录器中设置的级别确定将传递给其处理程序的消息的严重性。每个处理程序中设置的级别确定处理程序将发送哪些消息。

来自

处理程序

setLevel()方法与logger对象中的方法一样,指定将发送到相应目标的最低严重性。为什么有两个setLevel()方法?记录器中设置的级别确定将传递给其处理程序的消息的严重性。每个处理程序中设置的级别决定了处理程序将发送哪些消息。

我只想确保将最低的日志级别设置到我的“根”记录器实际上不会做任何事情,除非处理程序实际上也设置为低级别

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

我只想确保将最低的日志级别设置到我的“根”记录器实际上不会做任何事情,除非处理程序实际上也设置为低级别

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

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

我不确定您所说的“将尽可能低的日志级别添加到我的“根”记录器实际上什么也做不了”。如果你担心的话,它不会在你的两个处理程序之外的任何地方记录消息。是的,我知道它不会在其他地方记录消息,但我会不会因为将根记录器设置为调试级别而受到影响,性能方面,即使我的控制台/文件处理程序设置得更高?或者实际的stdout/write对文件的实际命中和日志记录没有任何作用(例如,如果两个处理程序都设置为INFO,则类似于调试消息)真的不会招致太多的惩罚吗?我不确定您所说的“将最低可能的日志级别保存到我的“根”日志记录程序实际上不会做任何事情”是什么意思。如果你担心的话,它不会在你的两个处理程序之外的任何地方记录消息。是的,我知道它不会在其他地方记录消息,但我会不会因为将根记录器设置为调试级别而受到影响,性能方面,即使我的控制台/文件处理程序设置得更高?或者实际的stdout/write到文件的实际命中和日志记录不会出现在任何地方(例如,如果两个处理程序都设置为INFO,则类似于调试消息),实际上不会招致太多的惩罚?