Python记录奇怪的行为

时间:2014-10-06 08:11:00

标签: python ubuntu logging module daemon

考虑以下代码:

ubuntu_logger = logging.getLogger('ubuntu-logger')

mail_handler = MailHandler()
mail_handler.setLevel(logging.INFO)
ubuntu_logger.addHandler(mail_handler)

filepath = "/home/ubuntu/logs/central.log"
formatter = logging.Formatter('[%(asctime)s - %(name)s - %(levelname)s]: %(message)s')

central_handler = logging.handlers.RotatingFileHandler(
    filename=filepath,
    mode="a+"
)
central_handler.setLevel(logging.DEBUG)
central_handler.setFormatter(formatter)
ubuntu_logger.addHandler(central_handler)

我在serverutils.logutils中创建了这个处理程序,这是一个自定义的python模块。然后,我将其导入我的守护程序服务脚本,该脚本由root用户运行:

from serverutils.logutils import ubuntu_logger as logger, DEFAULT_LOGGING_CONFIG

logger.info('pydaemons launching...')

使用上面的代码,ubuntu_logger根本不做任何事情。更改下面的代码后,除了根记录器之外,ubuntu_logger按预期工作:

import logging
from serverutils.logutils import ubuntu_logger as logger, DEFAULT_LOGGING_CONFIG

config = DEFAULT_LOGGING_CONFIG # Fancy format, log level DEBUG
config.update(filename='/home/ubuntu/test.log')

logging.basicConfig(**config)

logging.error('omg, this works')
logger.info('pydaemons launching...')

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您需要在ubuntu_logger上设置日志级别:

ubuntu_logger.setLevel(logging.DEBUG)

否则它会在根记录器上找到默认设置的WARNING级别。当您运行logging.basicConfig()时,您将根记录器的日志级别设置为DEBUG,因此ubuntu_logger选择了该记录,并且不再过滤您的INFO级日志消息。

当您调用其中一个logger.log()辅助函数(例如logger.info())时,通常会发生的事情是记录器检查当前级别是否允许该消息。如果它自己的级别是NOTSET(默认值),则查询父日志对象等,直到找到根,其中默认值为WARNING

如果您在特定记录器上设置了处理程序,可能想要禁用日志传播:

ubuntu_logger.propagate = False

否则根记录器要求处理日志消息。传播不会影响记录器开始发送消息的级别。