如何从Python日志记录器中获取文件名

20

我有以下代码

job_logger = logging.getLogger("abc")
job_handler = logging.FileHandler(filename)
job_logger.addHandler(job_handler)
print job_logger.something

我想要从job_logger对象中获取文件名。有任何建议吗?

3个回答

20

假设当前job_logger对象仅有一个处理程序。

>>> handler = job_logger.handlers[0]
>>> filename = handler.baseFilename
>>> print(filename)
'/tmp/test_logging_file'

当存在多个处理程序时,设计你的逻辑以获取它们全部或获取最后一个处理程序。


谢谢你!我想这将是唯一的识别方法。 - hyades
@hyades 很高兴能帮助您。 - starrify
2
这在我的程序不同的上下文中没有起作用。有效的方法是:my_logger.root.handlers[0].baseFilename。 - Michael Grazebrook
错误:模块“logging”没有属性“handlers”。 - Fernando V
1
@FernandoV 首先,您需要创建记录器实例“root = logging.getLogger()”,然后可以直接从该实例访问处理程序列表:“root.handlers”。 - Albert Alomar

4

您可以使用以下代码获取logger中使用的处理程序列表:

>>>handlers = job_logger.handlers
>>>handlers
[<FileHandler ./mypath/job_logger.log (NOTSET)>]

在你的情况下,只有一个,@starrify的解决方案就足够了:

>>>handlers[0].baseFilename
'./mypath/job_logger.log'

在您拥有更多处理程序且某些处理程序不是FileHandlers类型时,您可以使用列表推导式进行筛选:
>>> log_paths = [handler.baseFilename for handler in job_logger.handlers if isinstance(handler, logging.FileHandler)]
>>> next(iter(log_paths))
'./mypath/job_logger.log'

1

这只是一条注释,但使用了代码格式化。baseFilename仅存在于FileHandler子类中,因此

for handler in job_logger.handlers:
    if hasattr(handler, "baseFilename"):
        print(f"writing log to {getattr(handler, 'baseFilename')}")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接