Для этого вы можете добавить собственный формат и затем написать собственный фильтр для него, чтобы заполнить его значение:
'formatters': {
'simple_trace': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(trace)s'
},
Теперь CustomFilter должен быть унаследован от logging.Filter что-то вроде:
class CustomFilter(logging.Filter):
def filter(self, log_record):
def _get_trace():
trace = ""
if log_record.levelname in ['ERROR', 'CRITICAL']:
# Get the recent stack-trace
trace = traceback.format_exc().strip()
return json.dumps(trace)
log_record.trace = _get_trace()
Подобным образом вы можете добавить другой формат и просто добавить его значение в log_record.
Наконец, нам нужно унаследовать обработчик (в вашем случае - logging.FileHandler) и добавить этот пользовательский фильтр вit.
class CustomHandler(logging.FileHandler):
def __init__(self, *args, **kwargs):
logging.FileHandler.__init__(self, *args, **kwargs)
self.addFilter(CustomFilter())
при установке обработчиков нам нужно поместить наш CustomHandler в класс:
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging_custom.CustomHandler', # path to CustomHandler defination
'filename': 'logs/debug.log',
'formatter': 'simple_trace'
},
},