Django 自定义日志格式一致性
我正在尝试为Django配置日志记录,希望每条日志中都能包含session_key(如果设置了的话)。我觉得我找到了一个方法:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'request': {
'format': '%(asctime)s %(levelname)-8s [%(sessid)s] %(message)s',
},
},
'filters': {
'request': {
'()': 'yellowballs.yblogging.RequestFilter'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'filters': ['request'],
'formatter': 'request',
}
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
},
}
过滤器是这样定义的:
class RequestFilter(logging.Filter):
def filter(self, record):
session_store = SessionStore()
record.sessid = session_store.session_key
return True
看起来效果不错,但Django的日志消息还是用它默认的格式记录:
2013-03-01 08:44:41,359 WARNING [None] Not Found: /
[01/Mar/2013 08:44:41] "GET / HTTP/1.1" 200 1962
我该怎么做才能让像[01/Mar/2013 08:44:41] "GET / HTTP/1.1" 200 1962
这样的日志行显示成和其他日志一样的格式呢?
有没有简单好看的方法可以覆盖Django的默认格式,让整个项目的日志消息保持一致?
3 个回答
0
我觉得你忘记用了格式化工具:
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'filters': ['set_sessid'],
'formatter': 'request', // this
},
},
2
覆盖默认的日志格式对我来说有效。这样做是必要的,可以阻止信息的传播。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
"verbose": {
"format": (
"%(levelname)s %(name)s %(message)s [PID:%(process)d:%(threadName)s]"
)
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'loggers': {
'django.server': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, ### NOTE HERE !!!
}
}
}
0
看起来这些日志不是我的应用程序记录的,而是由 manage.py runserver
这个服务器记录的。所以我们没法对它们进行格式化。如果把应用程序的日志记录到一些文件里,就可以完全把这些日志去掉,不过这样也没关系,因为它们本来就不应该出现在这里 :)