[英]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.