Python - 从多个模块记录到旋​​转文件而无需打印到控制台

时间:2015-06-10 20:34:08

标签: python logging

我正在尝试将记录添加到中等大小的Python项目中,并且中断最少。我想从多个模块登录到静默旋转文件(不向终端打印消息)。我试图修改this example,除了一个问题,我几乎拥有我需要的功能。

以下是我尝试在主脚本中配置内容的方法:

import logging
import logging.handlers
import my_module

LOG_FILE = 'logs\\logging_example_new.out'

#logging.basicConfig(level=logging.DEBUG)

# Define a Handler which writes messages to rotating log files.
handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=100000, backupCount=1)
handler.setLevel(logging.DEBUG)     # Set logging level.
# Create message formatter.
formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
# Tell the handler to use this format
handler.setFormatter(formatter)

# Add the handler to the root logger
logging.getLogger('').addHandler(handler)

# Now, we can log to the root logger, or any other logger. First the root...
logging.debug('Root debug message.')
logging.info('Root info message.')
logging.warning('Root warning message.')
logging.error('Root error message.')
logging.critical('Root critical message.')

# Use a Logger in another module.
my_module.do_something()                     # Call function which logs a message.

以下是我在模块中尝试做的一个示例:

import logging

def do_something():
    logger = logging.getLogger(__name__)
    logger.debug('Module debug message.')
    logger.info('Module info message.')
    logger.warning('Module warning message.')
    logger.error('Module error message.')
    logger.critical('Module critical message.')

现在,这是我的问题。我目前无声地将消息记录到旋转文件中。但我只收到警告,错误和关键信息。尽管设置了handler.setLevel(logging.DEBUG)

如果我取消注释logging.basicConfig(level=logging.DEBUG),那么我会收到日志文件中的所有消息,但我也会将消息打印到终端。

如何将所有超过指定阈值的消息发送到我的日志文件而不将它们输出到终端?

谢谢!

更新 根据此answer,调用logging.basicConfig(level=logging.DEBUG)似乎会自动将StreamHandler添加到Root记录器,您可以将其删除。当我删除它只留下我的RotatingFileHandler时,消息不再打印到终端。我仍然想知道为什么在设置logging.basicConfig(level=logging.DEBUG)时必须使用handler.setLevel(logging.DEBUG)来设置消息级别阈值。如果有人能够对这些问题有所了解,我们仍然会感激不尽。

1 个答案:

答案 0 :(得分:4)

您还需要调用记录器本身的日志记录级别。我相信默认情况下,记录器上的日志记录级别为logging.WARNING

实施例

root_logger = logging.getLogger('')
root_logger.setLevel(logging.DEBUG)

# Add the handler to the root logger
root_logger.addHandler(handler)

记录器日志级别确定记录器实际记录的内容(即实际将哪些消息传递给处理程序)。处理程序日志级别确定它将实际处理的内容(即实际输出到文件,流等的消息)。因此,您可能有多个处理程序连接到记录器,每个处理器处理不同的日志级别。

这里有SO answer,解释了这种方式的工作原理