Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 日志记录-合并多个配置文件_Python_Python 2.7 - Fatal编程技术网

Python 日志记录-合并多个配置文件

Python 日志记录-合并多个配置文件,python,python-2.7,Python,Python 2.7,我正在从事一个项目,在这个项目中,我们有一个加载多个插件的核心应用程序。 每个插件都有自己的配置文件,核心应用程序也有一个 我们正在使用python标准库中的优秀日志模块。 日志模块包括从.ini文件加载日志配置的功能。 但是,如果加载另一个配置文件,则会丢弃其他文件,只使用新配置 我想做的是将我的日志配置分割成多个文件,这样应用程序就可以加载自己的配置文件,然后加载每个插件,将它们的日志配置合并到主文件中 注意:fileConfig有一个名为disable_existing_loggers的选

我正在从事一个项目,在这个项目中,我们有一个加载多个插件的核心应用程序。 每个插件都有自己的配置文件,核心应用程序也有一个

我们正在使用python标准库中的优秀日志模块。 日志模块包括从.ini文件加载日志配置的功能。 但是,如果加载另一个配置文件,则会丢弃其他文件,只使用新配置

我想做的是将我的日志配置分割成多个文件,这样应用程序就可以加载自己的配置文件,然后加载每个插件,将它们的日志配置合并到主文件中

注意:fileConfig有一个名为disable_existing_loggers的选项,可以设置为False。但是,这只会使现有记录器保持活动状态,但仍会清除处理程序的内部映射(这意味着插件的配置不能使用应用程序配置文件中定义的处理程序)

我可以手动合并这些文件以生成自己的配置,但我宁愿避免这样做

谢谢


更清楚地说,我想这样做:

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