如何在Cloud Run日志中展示Django运行日志与错误日志?
问题根因
你遇到的日志无法采集问题主要由3个原因导致:
- uWSGI默认开启stdout缓冲,Python默认也会对stdout输出做行缓冲,日志没有实时刷出到标准流,导致Cloud Run无法采集
- Django默认root logger级别为WARNING,你输出的INFO级别日志优先级低于WARNING,被直接过滤
- 未明确配置日志输出到无缓冲的stderr,stdout的缓冲机制进一步提升了日志丢失概率
首先先回答你的疑问:Cloud Run不需要你向/var目录写入日志,只要进程将内容输出到stdout或stderr流就会自动采集,你当前的supervisor配置已经正确将uWSGI、nginx的输出定向到了/dev/stdout、/dev/stderr,这部分无需调整。
解决步骤
1. 修改uwsgi.ini配置,关闭缓冲
在uwsgi.ini的[base]段添加以下配置:
# 强制Python关闭输出缓冲 env = PYTHONUNBUFFERED=1 # 关闭uWSGI日志缓冲,实时输出 log-master = true disable-write-exception = true buffer-size = 65535 # 将uWSGI日志统一输出到stderr log-to = /dev/stderr
2. 调整Django LOGGING配置
修改settings.py中的日志配置:
- 明确指定StreamHandler输出到stderr
- 按需调整root logger级别,匹配你需要输出的日志等级
- 新增django.request logger配置,确保500错误栈完整输出
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'local': { 'format': "[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s" }, 'verbose': { 'format': '{message}', 'style': '{', }, }, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', } }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'stream': 'ext://sys.stderr', # 新增:明确输出到无缓冲的stderr 'formatter': 'local', }, }, 'root': { 'handlers': ['console'], 'level': 'INFO', # 从WARNING调整为INFO,可输出INFO及以上级别的日志 }, 'loggers': { 'users': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, }, 'django': { 'handlers': ['console'], 'level': 'INFO', 'propagate': True, # 改为True,让子logger(如django.request)的日志可向上传递 }, 'django.db.backends': { 'handlers': ['console'], 'level': 'INFO', 'propagate': False, }, # 新增:捕获请求异常,输出完整栈追踪 'django.request': { 'handlers': ['console'], 'level': 'ERROR', 'propagate': False, }, 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' } } }
3. 验证Error Report功能
调整后只要错误日志完整输出到stderr,包含Python异常栈信息,Cloud Run Error Report会自动识别上报,无需额外配置。
你编写的logger.info('hello world')日志只要对应模块的logger级别不高于INFO,就会正常输出到Cloud Run日志面板。
内容的提问来源于stack exchange,提问作者Nori
相关产品推荐
相关产品推荐

