代码之家  ›  专栏  ›  技术社区  ›  Jace Browning

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

  •  1
  • Jace Browning  · 技术社区  · 6 年前

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

    • mypackage/
      • __init__.py
      • topmodule.py
      • subpackage/
        • 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='???')

    1 回复  |  直到 6 年前
        1
  •  8
  •   Martijn Pieters    6 年前

    您可以通过创建一个 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
    

    (实际输出,除了我修改了上面的行号)。