[英]Python using logging in a module
我试图找到在模块中设置日志记录的最佳方法,包括here ,但似乎仍然无法按预期工作。
我的文件是:
Foo
__init__.py
bar.py
app.py
内容是:
__init__.py
import logging
logging.getLogger(__name__).addHandler(logging.NullHandler())
bar.py
import logging
class Bar(object):
def __init__(self):
self.logger = logging.getLogger(__name__)
#self.logger.addHandler(logging.StreamHandler())
self.logger.warning('Logger - Create bar')
print('Print - Create bar')
app.py
from foo.bar import Bar
import logging
# create logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to console_handler
console_handler.setFormatter(formatter)
# add console_handler to logger
logger.addHandler(console_handler)
bar = Bar()
以这种格式运行app.py不会产生日志记录输出。
但是,如果我取消注释bar.py中的行:
self.logger.addHandler(logging.StreamHandler())
我得到了日志记录输出,但是没有按照app.py定义的格式进行格式化。
有人可以帮我了解我所缺少的吗?
应用程序应指定日志记录而不是库,因此,如果要启用foo / bar.py的日志记录,则需要在app.py上添加一个不同于NullHandler的处理程序。 做到这一点的方法就是在实例化Bar之前添加以下行:
logging.getLogger('foo').addHandler(console_handler)
然后,bar.py的日志记录将以您在app.py上定义的相同格式输出。
有关更多参考,请查看有关日志记录的python旅行者指南
为什么要输出?
从文档: NullHandler
位于核心日志记录程序包中的NullHandler类不执行任何格式化或输出。 本质上,它是供库开发人员使用的“无操作”处理程序。
如果要将格式化程序设置为logging.basicConfig()
或实例,则将其应用于logging.basicConfig()
(就像对console_handler
所做的那样)。
现在,您只需将其添加到bar.logger.addHandler()(通过func fe),而不必在其他py文件中创建与bar中的成员相同的新变量。
本质上:您有多个记录器,如果您打印名称,那么您会得到一些帮助:
Foo
__main__
Foo.bar
您只配置main的Formatter,而不配置其他。
要调试什么以及是否设置了任何处理程序/格式字符串:
for l in logging.Logger.manager.loggerDict:
loggr = logging.Logger.manager.loggerDict[l]
print("Found logger: " + l)
if loggr.handlers:
for h in loggr.handlers:
formr = loggr.handlers[0].formatter
if formr:
print(" {} {}".format(l, formr._fmt))
else:
print(" {} has no formatter set.".format(l))
else:
print(" {} has no handlers.".format(l))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.