【发布时间】:2021-05-28 10:12:27
【问题描述】:
我对 Django 不是很熟悉,但必须对项目的日志记录方式进行一些更改。我想将请求对象中的信息添加到日志中。
import logging
MODULE_LOGGER = logging.getLogger(__name__)
class IndexPage():
def get(self, request, *args, **kwargs):
MODULE_LOGGER.warning("log me!")
# code...
return self.render_to_response(context)
然后这会被这个类注销:
import json
from fluent import handler
class JsonFormatter(handler.FluentRecordFormatter):
def format(self, record):
data = super(JsonFormatter, self).format(record)
return json.dumps(data)
我们有以下记录器设置(我不太明白)
LOGGING = {
"version": 1,
"disable_existing_loggers": True,
"root": {"level": "WARNING", "handlers": ["sentry", "json_console"]},
"formatters": {
"console": {"datefmt": syslog_date_fmt, "format": syslog_msg_format},
"json_fmt": {
"()": "out_project.logs.JsonFormatter",
"format": {
"level": "%(levelname)s",
"hostname": "%(hostname)s",
"name": "%(name)s",
"where": "%(module)s.%(funcName)s",
"stack_trace": "%(exc_text)s",
},
},
},
"filters": {
"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"},
"file_logging": {"": ""},
},
"handlers": {
"null": {
"level": "DEBUG",
"class": "logging.NullHandler",
},
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "console",
},
"sentry": {
"level": "WARNING",
"class": "raven.contrib.django.raven_compat.handlers.SentryHandler",
},
"json_console": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "json_fmt",
},
},
"loggers": {
"raven": {
"level": "INFO",
"handlers": ["json_console"],
"propagate": False,
},
"sentry.errors": {
"level": "INFO",
"handlers": ["json_console"],
"propagate": False,
},
"out_project": {
"level": "INFO",
"propagate": True,
},
},
}
Django 文档讨论了 django.request 记录器,但这似乎是在请求出现问题时(比如 4XX、5XX 错误)。我尝试添加这个记录器,它的处理程序是json_console 处理程序,但是request 对象没有出现在record 对象上。
理想情况下,我希望将请求对象中的数据添加到记录中,或者让它自动放在那里。我假设一旦它存在,我就可以通过更新 json_fmt.format 属性来更改日志的外观。
据我了解,我可以将其他信息添加到各个日志中,但是我希望从请求中获取的数据需要添加到通过来自logging.getLogger(__name__) 的记录器完成的每个日志中。
我对 Django 中的日志记录工作方式非常陌生,因此,如果我解释或理解有误,我深表歉意。
【问题讨论】: