我在settings.py中编写了一个简单的django LOGGING,除了在日志中记录所有带有追溯的错误外。但是它并没有,它只记录错误和所有内容在一行中,但是回溯记录到控制台中。 这是我的日志记录:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '{levelname} {asctime} {name} {module}.{funcName}:{lineno} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'logs/debug.log',
'formatter': 'simple'
},
},
'loggers': {
'': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': False,
},
},
}
有人可以帮助我了解为什么以及怎么做吗? 谢谢。
答案 0 :(得分:0)
您使用的格式化程序是“简单的”(如配置中所定义:
'formatters': {
'simple': {
'format': '{levelname} {asctime} {name} {module}.{funcName}:{lineno} {message}',
'style': '{',
},
},
因此,玩弄这个技巧是:看一下:https://docs.python.org/3/library/logging.html#logrecord-attributes
您可能想要的是:{stack_info}
答案 1 :(得分:0)
要实现此目的,您可以添加自定义格式,然后为其编写自定义过滤器以填充其值:
'formatters': {
'simple_trace': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(trace)s'
},
现在,CustomFilter应该从日志记录继承。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),然后向其中添加此自定义过滤器。
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'
},
},