优化Django Logging配置 仅保留自定义日志屏蔽默认冗余条目
问题根因
你看到的两条冗余日志分别来自Django框架内置的两个独立日志模块,和自定义日志本身无关:
- 第二条
Forbidden: /api/v1/<path/日志:由django.security模块生成,请求触发权限拒绝、CSRF校验失败等安全类拦截时自动输出 - 第三条
"GET /api/v1/<path/ HTTP/1.1" 403 12495日志:由django.request模块生成,每次请求处理完成后自动输出访问统计记录
你当前的LOGGING配置仅对根级djangologger绑定了控制台输出、设置了INFO级别,所有Django子模块的INFO及以上日志都会被统一输出,没有对上述两个产生冗余日志的子模块做单独控制,因此出现单请求3条日志的问题。
优化配置
无需修改业务代码,仅调整settings.py中的LOGGING配置即可,核心是对两个产生冗余日志的子logger单独设置日志阈值,同时关闭日志向上传播避免重复输出,参考配置如下:
LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'timestamp': { 'format': '{asctime} {levelname} {message}', 'style': '{', }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'timestamp' }, }, 'loggers': { # 根django logger保留原有配置,输出业务自定义日志、框架核心必要日志 'django': { 'handlers': ['console'], 'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), 'propagate': False, }, # 调整django.request日志级别,仅输出5xx服务端错误,屏蔽4xx类正常响应的访问日志 'django.request': { 'handlers': ['console'], 'level': 'ERROR', 'propagate': False, }, # 调整django.security日志级别,仅输出严重安全异常,屏蔽403等常规权限拦截日志 'django.security': { 'handlers': ['console'], 'level': 'ERROR', 'propagate': False, }, }, }
配置项说明:
propagate: False用于阻止日志事件向父级logger传递,避免同一条日志被多个logger重复处理输出,是解决Django日志重复问题的关键配置。
效果验证
配置生效后,同接口请求将仅保留你在视图层编写的自定义业务日志:
2022-06-02 10:26:09,714 WARNING /api/v1/<path/ GET 403: user 71 - You do not have permission to perform this action.
该配置不会影响5xx服务端错误、严重安全异常的日志输出,不影响线上问题排查,同时可减少60%以上的非必要日志存储开销,完全适配Loki的结构化日志查询要求。
内容的提问来源于stack exchange,提问作者everspader
相关产品推荐
相关产品推荐

