调用getLogger()后如何获取Python logging对象的日志文件路径
解答
你通过getLogger()拿到的logger实例本身不存储日志文件路径,路径信息保存在logger关联的**日志处理器(Handler)**上。由于logging存在层级冒泡机制,子logger默认会复用父级logger的处理器配置,只要遍历当前logger及其所有父级logger挂载的文件类处理器,就能拿到完整的日志文件路径。
可直接复用的实现代码
import logging from logging import FileHandler def get_log_file_paths(target_logger: logging.Logger) -> list[str]: """ 获取指定logger关联的所有日志文件绝对路径 自动遍历父级logger链,覆盖继承的配置 """ paths = [] current = target_logger while current is not None: for handler in current.handlers: # 匹配所有文件类型处理器,包含按大小/时间切割的滚动日志处理器 if isinstance(handler, FileHandler): # baseFilename是logging官方存储的日志文件绝对路径 paths.append(handler.baseFilename) current = current.parent return paths
调用方式
# 拿到你在子脚本里初始化的logger logger = logging.getLogger(__name__) log_paths = get_log_file_paths(logger) print(log_paths) # 对应你配置的场景会输出: ['/path/to/log/file.log']
关键说明
- 不要用
handler.stream.name取路径,自定义流包装场景下这个值可能不准,handler.baseFilename是FileHandler类官方暴露的属性,存的是初始化时自动转换好的绝对路径,不管你配置时写相对路径还是绝对路径,拿到的都是文件的完整存储位置。 - 必须遍历父级logger链的原因:你通过
logging.getLogger(__name__)拿到的模块级子logger默认不会挂载任何处理器,所有日志会向上冒泡到根logger(也就是你调用logging.basicConfig()初始化的root logger)处理,只检查当前logger的handlers属性会拿到空列表。 - 这个写法兼容所有FileHandler子类,包括常用的
RotatingFileHandler(按大小切割日志)、TimedRotatingFileHandler(按时间切割日志),只要是写文件的日志处理器都能正确识别。 - 如果你的配置里给同一个logger绑定了多个文件输出(比如INFO级日志存一个文件、ERROR级日志单独存另一个),函数会把所有对应的文件路径都返回。
注:你提供的初始化代码里
import loggging是笔误,实际运行要改成import logging否则会触发导入错误。
内容的提问来源于stack exchange,提问作者Michael Altfield
相关产品推荐
相关产品推荐

