【问题标题】:Pass keyword arg to log handler in python logging configuration file将关键字 arg 传递给 python 日志记录配置文件中的日志处理程序
【发布时间】:2015-05-27 23:29:30
【问题描述】:

根据https://docs.python.org/2/library/logging.config.html#configuration-file-format,我可以使用args 键为记录器的构造函数指定参数。但这似乎只适用于位置参数。我有一个需要一些关键字参数的处理程序。有没有办法在配置文件中指定这些?

【问题讨论】:

    标签: python logging configuration


    【解决方案1】:

    很遗憾地告诉你,答案是

    查看https://hg.python.org/cpython/file/2.7/Lib/logging/config.py#l163了解更多详情。

    如有疑问,源代码永远是您的朋友!

    【讨论】:

      【解决方案2】:

      我不同意答案是否定的。

      您可以将关键字参数放在一行中,就像在这个 SysLogHandler 示例中一样,没有位置参数,只有关键字参数:

      类 logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)

      [handler_mainHandler]
      class=logging.handlers.SysLogHandler
      level=INFO
      formatter=defaultFormatter
      args=('/dev/log','myapp')
      

      Python 会将“/dev/log”作为地址关键字参数,将“myapp”作为设施参数。它们按出现的顺序处理。

      python2python3 的文档中都有这样的示例:

      [handler_hand05]
      class=handlers.SysLogHandler
      level=ERROR
      formatter=form05
      args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
      

      但也有一些缺点:

      将旧式编写的配置文件“升级”为 yaml 编写的文件允许以更好、更明确的方式使用关键字参数。请注意,文档以及 python2python3 的文档都明确讨论了关键字参数:

      callable 将与 配置子字典作为关键字参数。

      【讨论】:

        【解决方案3】:

        使用 YAML(不是 .ini),如果你使用 () 特殊键而不是 class 关键字,所有属性在同一级别将作为参数传递给构造函数。

        例如使用外部格式化程序,这将忽略 log_colors 参数:

        formatters:
          class:
            class: colorlog.ColoredFormatter
            log_colors: { DEBUG: 'cyan', INFO: 'green', WARNING: 'yellow', ERROR: 'red', CRITICAL: 'red,bg_white' }
            format: '%(log_color)s[%(asctime)s-%(shorter_levelname)s-%(compact_name)s]%(message)s'
            datefmt: '%H:%M:%S'
        

        这将起作用:

        formatters:
          color:
            (): colorlog.ColoredFormatter
            log_colors: { DEBUG: 'cyan', INFO: 'green', WARNING: 'yellow', ERROR: 'red', CRITICAL: 'red,bg_white' }
            format: '%(log_color)s[%(asctime)s-%(shorter_levelname)s-%(compact_name)s]%(message)s'
            datefmt: '%H:%M:%S'
        

        【讨论】:

          猜你喜欢
          • 2023-01-10
          • 1970-01-01
          • 2019-03-17
          • 1970-01-01
          • 2020-03-27
          • 2018-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多