Python 日志记录-合并多个配置文件
我正在从事一个项目,在这个项目中,我们有一个加载多个插件的核心应用程序。 每个插件都有自己的配置文件,核心应用程序也有一个 我们正在使用python标准库中的优秀日志模块。 日志模块包括从.ini文件加载日志配置的功能。 但是,如果加载另一个配置文件,则会丢弃其他文件,只使用新配置 我想做的是将我的日志配置分割成多个文件,这样应用程序就可以加载自己的配置文件,然后加载每个插件,将它们的日志配置合并到主文件中 注意:fileConfig有一个名为disable_existing_loggers的选项,可以设置为False。但是,这只会使现有记录器保持活动状态,但仍会清除处理程序的内部映射(这意味着插件的配置不能使用应用程序配置文件中定义的处理程序) 我可以手动合并这些文件以生成自己的配置,但我宁愿避免这样做 谢谢Python 日志记录-合并多个配置文件,python,python-2.7,Python,Python 2.7,我正在从事一个项目,在这个项目中,我们有一个加载多个插件的核心应用程序。 每个插件都有自己的配置文件,核心应用程序也有一个 我们正在使用python标准库中的优秀日志模块。 日志模块包括从.ini文件加载日志配置的功能。 但是,如果加载另一个配置文件,则会丢弃其他文件,只使用新配置 我想做的是将我的日志配置分割成多个文件,这样应用程序就可以加载自己的配置文件,然后加载每个插件,将它们的日志配置合并到主文件中 注意:fileConfig有一个名为disable_existing_loggers的选
更清楚地说,我想这样做:
# application.ini
[loggers]
keys=root,app
[handlers]
keys=rootHandler,appHandler
[formatters]
keys=myformatter
[logger_root]
# stuff
[handler_rootHandler]
# stuff
[formatter_myformatter]
# stuff
...
# plugin.ini
[loggers]
keys=pluginLogger # no root logger
[handlers]
keys=pluginHandler # no root handler
# no formatters section
[logger_pluginLogger]
# stuff
formatter=myformatter # using the formatter from application.ini
我找不到一种方法来做我想做的事,所以我最终通过一门课来完成 这里是一个方便的地方。我通常通过logging.config.dictConfig和pyYaml包来实现这一点。该包允许您将配置文件的内容作为dict对象加载 唯一需要的是一个处理配置覆盖/加载项的小助手类:
import yaml
class Configuration(dict):
def __init__(self,
config_file_path=None,
overwrites=None):
with open(config_file_path) as config_file:
config = yaml.load(config_file)
super(Configuration, self).__init__(config)
if overwrites is not None:
for overwrite_key, value in overwrites.items():
self.apply_overwrite(self, overwrite_key, value)
def apply_overwrite(self, node, key, value):
if isinstance(value, dict):
for item in value:
self.apply_overwrite(node[key], item, value[item])
else:
node[key] = value
例如,如果您的主配置是:
logger:
version: 1
disable_existing_loggers: False
formatters:
simple:
format: '%(levelname)s: Module: %(name)s Msg: %(message)s'
handlers:
file:
level: DEBUG
class: logging.handlers.RotatingFileHandler
maxBytes: 10000000
backupCount: 50
formatter: simple
filename: '/tmp/log1.log'
root:
handlers: [file]
level: DEBUG
您的覆盖是:
logger:
handlers:
file:
filename: '/tmp/log2.log'
您可以按如下方式获取覆盖的记录器:
from configuration import Configuration
from logging.config import dictConfig
import logging
if __name__ == '__main__':
config = Configuration('standard.yml', overwrites=Configuration('overwrite.yml'))
dictConfig(config['logger'])
logger = logging.getLogger(__name__)
logger.info('I logged it')