我正在尝试将日志记录(到控制台而不是文件)添加到我已经工作了一段时间的代码中。读了一下后,我认为应该有一种模式可行,但我不太确定我哪里出错了。
我有以下三个文件(显然是简化的):
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()
当我运行它们时,只有第一次调用日志会产生一个输出到控制台 - “开始记录”。第二次调用日志 - “启动我的模块”刚刚过去。
我误解/破坏了什么?
答案 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
方法可能让你感到困惑(它帮了我)。