在python中记录异常过滤器

Quy*_*ang 2 python

我想从使用raven处理程序记录到哨兵中排除一些不重要的特定异常。

但是,我找不到任何方法来为这些处理程序配置过滤器。

Java 中类似的日志功能是https://logging.apache.org/log4j/2.0/manual/filters.html

我想做这样的事情

import logging
...

LOGGING = {
    'loggers' = {
       'django': {
        'handlers': ['sentry', 'console'],
        'filters': {
          'exclude': [ObjectDoesNotExist, ]
        },
        'level': 'ERROR',
       }
     }
}
Run Code Online (Sandbox Code Playgroud)

做logging包的支持吗?如果不是,您介意告诉我实现这一目标的最佳方法吗?

谢谢

Quy*_*ang 5

感谢@georgexsh 的建议,我终于得到了这个解决方案。

# config.log_filter.py
from logging import Filter
from django.core.exceptions import ObjectDoesNotExist

DEFAULT_EXCLUDE_EXCEPTIONS = [ObjectDoesNotExist, ]


class ExceptionFilter(Filter):
    def __init__(self, exclude_exceptions=DEFAULT_EXCLUDE_EXCEPTIONS, **kwargs):
      super(ExceptionFilter, self).__init__(**kwargs)
      self.EXCLUDE_EXCEPTIONS = exclude_exceptions

    def filter(self, record):
        if record.exc_info:
            etype, _, _ = record.exc_info
            for excluded_exception in self.EXCLUDE_EXCEPTIONS:
                if issubclass(etype, excluded_exception):
                    return False
        return True


# settings.common.py
...
LOGGING = {
    ...
    'filters': {
        'exception_filter': {
            '()': 'config.log_filter.ExceptionFilter'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'filters': ['exception_filter']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
        ...
     }
}
logging.config.dictConfig(LOGGING)
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助那些遇到同样问题的人