首页 > 解决方案 > 无法使用 dictConfig 配置过滤器

问题描述

我在使用dictConfig. 这是我正在使用的配置字典

{ 'disable_existing_loggers': False,
  'filters': { 'request': { '()': <class 'applogging.filters.RequestFilter'>}},
  'formatters': { 'full': { 'format': '[%(asctime)s %(levelname)-8s %(request_id)s] %(name)s[%(filename)s:%(module)s:%(funcName)s:%(lineno)d]: %(message)s'},
                  'medium': { 'format': '[%(asctime)s %(levelname)-8s %(request_id)s] %(name)s[%(module)s:%(lineno)d]: %(message)s'},
                  'short': { 'format': '[%(levelname)-8s] [%(request_id)s] TEST :%(name)s:%(lineno)d: %(message)s'}},
  'handlers': { 'default': { 'class': 'logging.StreamHandler',
                             'formatter': 'short',
                             'level': 'DEBUG'}},
  'loggers': { '': { 'filters': ['request'],
                     'handlers': ['default'],
                     'level': 'WARNING',
                     'propagate': True},
               'billing': { 'level': 'INFO'},
               'boto': { 'level': 'WARNING'},
               'boto3': { 'level': 'WARNING'},
               'botocore': { 'level': 'WARNING'},
               'shiphero.bulkship': { 'level': 'INFO'},
               'shiphero.core.product.uploader': { 'level': 'INFO'},
               'shiphero.inventory.uploader': { 'level': 'INFO'},
               'shiphero_app.core.inventory': { 'level': 'INFO'},
               'shiphero_app.core.order': { 'level': 'INFO'},
               'shiphero_app.core.rules.allocation': { 'level': 'DEBUG'},
               'shiphero_app.modules.queue_workers': { 'level': 'INFO'},
               'shiphero_app.modules.tasks': { 'level': 'INFO'},
               'shiphero_app.services.pending_shipments': { 'level': 'DEBUG'},
               'shiphero_app.services.returns': { 'level': 'INFO'},
               'shiphero_app.services.shipment': { 'level': 'DEBUG'}},
  'version': 1}

request过滤器根据 https://docs.python.org/2/howto/logging-cookbook.html#filters-contextual 添加到日志record.request_id记录

class RequestFilter(logging.Filter):
    def filter(self, record):
        if not request:
            return True

        record.url = request.url
        record.body = request.get_json()
        if 'request_id' not in g:
            g.request_id = uuid.uuid4()
        record.request_id = g.request_id
        return True

但是过滤器没有运行,当我尝试记录一些东西时,它说:KeyError: 'request_id'

如果我将其添加到配置字典的根目录:

  'loggers': { '': { 'filters': ['request'],
               ....
  'root': {
      'filters': ['request'],
  }

或者我使用'root': { 'filters': ['request']....inside 'loggers',然后错误消失并且过滤器运行,但格式字符串被忽略。

我错过了什么?

标签: pythonpython-2.7python-logging

解决方案


推荐阅读