我正在尝试为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的默认格式,以便日志消息在整个项目中保持一致?
答案 0 :(得分:0)
我想您忘了使用格式化程序:
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'filters': ['set_sessid'],
'formatter': 'request', // this
},
},
答案 1 :(得分:0)
似乎这些行不是由我的应用程序记录的,而是由manage.py runserver
服务器记录的。因此无法格式化它们,而是将应用程序日志记录到某些文件中。这将完全从应用程序日志中删除这些行,但这没关系,因为它们不属于那里:)
答案 2 :(得分:0)
覆盖对我有用的默认日志格式。必须必须停止传播。
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 !!!
}
}
}