9

我正在尝试将日志记录(到控制台而不是文件)添加到我一直在研究的一段代码中。阅读了一下,我有一个我认为应该工作的模式,但我不太确定我哪里出错了。

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

控制器.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

我的模块.py

import logging

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

if __name__ == "__main__":
    main()

当我运行它们时,只有第一次调用 logging 才会向控制台输出输出 - “Started logging”。第二次调用日志——“启动我的模块”刚刚被忽略。

我误解/破坏了什么?

4

2 回答 2

19

根据文档,看起来您可能会使用更简单的设置,如下所示:

如果您的程序由多个模块组成,下面是一个如何组织登录的示例:

# 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但没有父关系会导致日志条目)

于 2013-06-05T18:41:09.213 回答
2

可以通过放置以下行来查看实际的错误:

print '__name__', __name__

在您的两个s的开头,main这会产生:

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

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

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

于 2013-06-05T19:06:08.113 回答