【问题标题】:How to get filename from a python logger如何从 python 记录器获取文件名
【发布时间】:2014-11-18 22:58:00
【问题描述】:

我有以下代码

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

我想知道 job_logger 对象的文件名。有什么想法吗?

【问题讨论】:

    标签: python python-2.7 logging


    【解决方案1】:

    假设job_logger 对象目前只有一个处理程序。

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

    当有多个处理程序时,设计逻辑以获取所有处理程序或获取最后一个处理程序。

    【讨论】:

    • 谢谢!认为这将是唯一的识别它然后
    • @hyades 很高兴为您提供帮助。
    • 这在我的程序的不同上下文中对我不起作用。起作用的是:my_logger.root.handlers[0].baseFilename
    • 错误:模块“日志”没有属性“处理程序”
    • @FernandoV 您首先需要创建您的记录器实例“root = logging.getLogger()”,然后您可以直接从实例访问处理程序列表:“root.handlers”。
    【解决方案2】:

    您可以使用以下方法获取记录器中使用的处理程序列表:

    >>>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'
    

    【讨论】:

      【解决方案3】:

      一个注释,但带有代码格式 baseFilename 只存在于 FileHandler 子类中,因此

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-24
        • 1970-01-01
        • 2020-11-03
        • 2015-12-04
        • 2011-03-05
        • 2015-09-22
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多