【发布时间】: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 消息)并没有真正招致太多的惩罚?