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

3 投票
1 回答
974 浏览
提问于 2025-04-28 21:48

我为Python 2.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,这样问题就解决了。

不过,如果我能把这个导入语句放到配置文件里就好了,这样加载文件的人就不需要知道或者在意这个细节了。像urlparse这样的东西也能这样处理,这样我就不需要设置那么多环境变量了。

有没有办法做到这一点呢?

暂无标签

1 个回答

0

这个问题虽然有点老了,但如果还有人想知道答案,我就把这个分享出来(适用于python2和python3)。

简短的回答

根据文档,你可以写类似这样的代码:

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

撰写回答