【问题标题】:Use of external modules in a logging configuration file在日志配置文件中使用外部模块
【发布时间】:2014-10-21 21:24:22
【问题描述】:

我已经用logstash为python2.7中的日志模块设置了以下配置文件

[loggers]
keys=root,test

[handlers]
keys=remote

[formatters]
keys=standard

[logger_root]
level=NOTSET
handlers=remote

[logger_test]
level=DEBUG
handlers=remote
propagate=0
qualname=test

[handler_remote]
class=logstash.LogstashHandler
level=NOTSET
formatter=standard
args=(os.environ['hostname'], int(os.environ['port']))

[formatter_standard] 
format=%(levelname)s - %(message)s
datefmt=
class=logging.Formatter

不幸的是,这是我可以为这个示例制作的文件一样短。我使用了一个名为logstash 的模块,它将我的日志消息发送出去以供远程查看。如果我尝试使用logging.config.fileConfig 加载此配置,我会收到一个错误,即找不到logstash。我所要做的就是在加载之前导入logstash,问题就消失了。

如果我可以将该导入语句放入配置文件本身,那就太好了,这样文件的加载器就不需要知道或关心。对于像urlparse 这样的东西也很好,所以我不需要那么多环境变量。

有没有办法做到这一点?

【问题讨论】:

    标签: python logging logstash configparser


    【解决方案1】:

    这是一个很老的问题,但如果有人还在寻找答案,我会发布这个(适用于 python2 和 python3)。

    简答

    根据the documentation,可以这样写:

    class=ext://logstash.LogstashHandler
    

    我不确定是否需要在解析日志配置文件的脚本中导入logstash(因为logstash不属于标准库)。

    另一种答案

    但我必须补充一点,这种机制在旧式日志记录配置文件中对我来说并不总是很有效......所以如果这不起作用,我建议将您的配置文件转换为 yaml 文件并在其中使用相同的功能:

    handlers:
        remote:
            class: ext://logstash.LogstashHandler
            level: NOTSET
            formatter: standard
    

    对于其他参数,我不知道如何编写它们,因为我找不到有关 logstash 的文档。如果它们是位置参数,这应该没问题(尽管我不确定在日志配置文件中使用int):

            args: [os.environ['hostname'], int(os.environ['port'])]
    

    但是如果它们是关键字参数,这应该写成另一种方式:

            kw1: os.environ['hostname']
            kw2: int(os.environ['port'])
    

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多