Python“root”loglevel和其他处理程序的级别

时间:2014-05-14 19:55:07

标签: python logging

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

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

澄清一下,如果我设置了logger.setLevel(logging.WARNING),然后在fileHandler或consoleHandler中尝试使用' logging.DEBUG',我仍然只能获得WARNING级日志打印在我的任一个日志目的地中。这对我来说是有道理的,因为fileHandler和consoleHandler是记录器的子对象(原谅我缺乏适当的词汇),但同样,我只想确保对我的" root"具有尽可能低的日志级别。记录器实际上并没有做任何事情,除非处理程序实际上也设置为低级别。

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 个答案:

答案 0 :(得分:2)

来自docs

<强>处理程序

...

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

答案 1 :(得分:2)

我只是想确保我的&#34; root&#34;具有尽可能低的日志级别。记录器实际上并没有做任何事情,除非处理程序实际上也设置为低级别。

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