2014-10-06 38 views
0

考虑以下代码:Python记录奇怪的行为

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

你需要设置ubuntu_logger日志级别:

ubuntu_logger.setLevel(logging.DEBUG) 

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

当您拨打logger.log()帮助程序函数(如logger.info())之一时,通常会发生的情况是记录程序检查当前级别是否允许该消息。如果它自己的级别是NOTSET(默认值),则会查询父级日志对象等,直到找到根,其中缺省值为WARNING

可能要禁用日志传播,如果你有处理程序上的特定记录器设置:

ubuntu_logger.propagate = False 

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

+0

我会更新这个问题,看起来我在错误的方向看 – Mazyod 2014-10-06 08:43:07

+1

@Mazyod:如果你这样做,请删除*编辑*标题;我们都可以看到编辑历史,无需在问题本身中对其进行评论。 :-) – 2014-10-06 08:44:02

+0

好的,谢谢。没有标题更新。 – Mazyod 2014-10-06 08:46:31