在日志配置文件中使用外部模块
我为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'])