簡體   English   中英

在python中記錄異常過濾器

[英]Logging exception filters in python

我想排除一些特定的異常,這些異常對於使用raven handler記錄到哨兵來說並不重要。

但是,我找不到任何方法來為這些處理程序配置過濾器。

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

我想做這樣的事情

import logging
...

LOGGING = {
    'loggers' = {
       'django': {
        'handlers': ['sentry', 'console'],
        'filters': {
          'exclude': [ObjectDoesNotExist, ]
        },
        'level': 'ERROR',
       }
     }
}

logging程序包支持嗎? 如果沒有,您介意告訴我實現此目標的最佳方法嗎?

謝謝

Python沒有內置的基於異常類型的日志記錄過濾器,您必須編寫一個:

class MyFilter(object):  
    def filter(self, record):
        if record.exc_info:
            etype, _, _ = record.exc_info
            for excluded_exc in [ObjectDoesNotExist,]:
                if issubclass(etype, excluded_exc):
                    return False
        return True

然后添加到日志記錄配置中,注意特殊的“ () ”,它是用戶定義對象的標志

'filters': {
    'myfilter': {'()': 'MyFilter'},
},

感謝@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)

希望它可以幫助遇到相同問題的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM