gpt4 book ai didi

python - 如何在 Python 日志记录语句中包含模块的相对路径?

转载 作者:行者123 更新时间:2023-11-28 21:35:09 25 4
gpt4 key购买 nike

我的项目有一个嵌套在根包下的子包,如下所示:

  • mypackage/
  • __init__.py
  • topmodule.py
  • subpackage/
  • __init__.py
  • nested.py

  • 我的目标是获取格式如下的日志记录:
    mypackage/topmodule.py:123: First log message
    mypackage/subpackage/nested.py:456: Second log message

    以便路径在我的终端中变得可点击。

    我尝试了以下格式。
  • '%(modulename).pys:%(lineno): %(message)s' 不可点击(点必须是斜线):
    mypackage.topmodule.py:123: First log message
    mypackage.subpackage.nested.py:456: Second log message
  • 'mypackage/%(filename)s:%(lineno): %(message)s' 不适用于子包:
    mypackage/topmodule.py:123: First log message
    mypackage/nested.py:456: Second log message
  • '%(pathname)s:%(lineno): %(message)s' 产生可点击的路径,但它们太长以至于它们切断了我的其余日志记录:
    /Users/jacebrowning/Documents/mypackage/topmodule.py:123: First log message
    /Users/jacebrowning/Documents/mypackage/subpackage/nested.py:456: Second log message


  • 是否有我可以传递给 logging.basicConfig(format='???') 的日志记录模式来生成我想要的日志记录?

    最佳答案

    您必须进行额外的处理才能在此处获得所需的路径。

    您可以通过创建 custom filter 进行此类处理并向日志记录添加其他信息,包括您自己的包的“本地”路径。

    过滤器实际上不必进行过滤,但它们确实可以访问所有日志记录,因此它们是更新缺少信息的记录的好方法。只需确保完成后返回 True:

    import logging
    import os
    import sys


    class PackagePathFilter(logging.Filter):
    def filter(self, record):
    pathname = record.pathname
    record.relativepath = None
    abs_sys_paths = map(os.path.abspath, sys.path)
    for path in sorted(abs_sys_paths, key=len, reverse=True): # longer paths first
    if not path.endswith(os.sep):
    path += os.sep
    if pathname.startswith(path):
    record.relativepath = os.path.relpath(pathname, path)
    break
    return True

    这会找到 sys.path 条目,它是日志记录上 pathname 的父目录,并在日志记录上添加一个新的 relativepath 条目。然后,您可以使用 %(relativepath)s 将其包含在您的日志中。

    将过滤器添加到您使用自定义格式化程序配置的任何处理程序:
    handler.addFilter(PackagePathFilter())

    并与 '%(relativepath)s:%(lineno)s: %(message)s' 一起作为您的日志消息的格式,如下所示:
    mypackage/topmodule.py:123: First log message
    mypackage/subpackage/nested.py:456: Second log message

    (实际输出,除了我改变了行号)。

    关于python - 如何在 Python 日志记录语句中包含模块的相对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52582458/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com