在日志记录配置文件中使用外部模块

时间:2014-10-21 21:24:23

标签: python logging logstash configparser

我在python2.7中使用logstash

为日志记录模块设置了以下配置文件
[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,问题就消失了。

如果我可以将该import语句放入配置文件本身,那将是很好的,因此文件的加载器不需要知道或关心。对urlparse之类的东西也很好,所以我不需要那么多的环境变量。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

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

简短回答

根据the documentation,您可以写出类似的内容:

class=ext://logstash.LogstashHandler

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

替代答案

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

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

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

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

但如果它们是关键字参数,则应以另一种方式编写:

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