跨多个模块的Python日志记录

时间:2013-06-05 18:27:30

标签: python logging python-2.7

我正在尝试将日志记录(到控制台而不是文件)添加到我已经工作了一段时间的代码中。读了一下后,我认为应该有一种模式可行,但我不太确定我哪里出错了。

我有以下三个文件(显然是简化的):

controller.py

import my_module    
import logging
from setup_log import configure_log

def main():
    logger = configure_log(logging.DEBUG, __name__)
    logger.info('Started logging')
    my_module.main()

if __name__ == "__main__":
    main()

setup_log.py

import logging

def configure_log(level=None, name=None):
    logger = logging.getLogger(name)
    logger.setLevel(level)
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s')
    console_handler.setFormatter(chFormatter)
    logger.addHandler(console_handler)
    return logger

my_module.py

import logging

def main():    
    logger = logging.getLogger(__name__)
    logger.info("Starting my_module")
    print "Something"

if __name__ == "__main__":
    main()

当我运行它们时,只有第一次调用日志会产生一个输出到控制台 - “开始记录”。第二次调用日志 - “启动我的模块”刚刚过去。

我误解/破坏了什么?

2 个答案:

答案 0 :(得分:18)

根据documentation看起来你似乎可以通过更简单的设置逃脱:

  

如果您的程序包含多个模块,请参阅以下示例   你可以组织登录:

# myapp.py
import logging
import mylib

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

# mylib.py
import logging

def do_something():
    logging.info('Doing something')
  

如果你运行myapp.py,你应该在myapp.log中看到这个:

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

您模块中对logger = logging.getLogger(__name__)的调用似乎是创建一个单独的轨道(级别为NOTSET但没有父关系导致日志条目)

答案 1 :(得分:2)

可以通过以下行看到实际的错误:

print '__name__', __name__

的开头你的main s产生:

$ python controller.py 
__name__ __main__
INFO - controller.py - Line: 8 - Started logging
__name__ my_module
Something

因此,您正确配置了名为__main__的记录器,但未配置名为my_module的记录器。

更深层次的问题是你有两个main方法可能让你感到困惑(它帮了我)。