据我所知,Python 记录器不能直接实例化,如文档所示:
请注意,记录器永远不会直接实例化,而是始终通过模块级函数实例化
logging.getLogger(name)
..这是合理的,因为您不应该为每个类/模块创建记录器对象,因为有更好的选择。
但是,在某些情况下,我想创建一个记录器对象并向其附加一个文件,专门用于将一些特定于应用程序的输出记录到该文件;然后关闭日志文件。
例如,我有一个程序可以在PyPI中构建所有包。所以基本上假设for每个包都有一个循环。在循环内,我想“创建”一个记录器,附加一个文件处理程序(例如:/var/logs/pypi/django/20090302_1324.build.log)并将输出python setup.py build(以及其他内容)发送到该日志文件。完成后,我想关闭/销毁记录器并continue以类似的方式构建其他包。
所以你看……正常的 Pythonic 调用方式logging.getLogger在这里不适用。需要创建临时记录器对象。
目前,我通过将文件名本身作为记录器名称传递来实现此目的:
>>> packagelog = logging.getLogger('/var/..../..34.log')
>>> # attach handler, etc..
Run Code Online (Sandbox Code Playgroud)
我想问..有更好的方法吗?
您可以使用一个记录器和多个处理程序,而不是使用多个记录器。例如:
log = logging.getLogger(name)
while some_condition:
try:
handler = make_handler(filename)
log.addHandler(handler)
# do something and log
finally:
log.removeHandler(handler)
handler.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
815 次 |
| 最近记录: |