如何在Heroku上查看与本地一致的Django运行服务日志?
可以实现,你之前执行heroku logs --tail仅能看到平台输出,是因为默认配置下Django生产环境不会把运行日志输出到标准输出流,Heroku的日志采集系统无法捕获这部分内容。只需要调整Django的日志配置,让日志输出到标准输出,即可得到和本地运行时完全一致的Django日志。
配置步骤
- 修改Django项目的
settings.py文件,添加如下日志配置:
import logging import sys LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { # 与本地runserver输出格式对齐的请求日志格式化器 'django.server': { '()': 'django.utils.log.ServerFormatter', 'format': '[{server_time}] {message}', 'style': '{', }, # 通用运行日志格式化器 'standard': { 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' }, }, 'handlers': { # 所有日志输出到标准输出,供Heroku采集 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'stream': sys.stdout, 'formatter': 'standard', }, 'django.server': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'stream': sys.stdout, 'formatter': 'django.server', }, }, 'loggers': { # Django核心日志 'django': { 'handlers': ['console'], 'level': 'INFO', 'propagate': True, }, # Django服务请求日志 'django.server': { 'handlers': ['django.server'], 'level': 'INFO', 'propagate': False, }, # 替换为你的自定义应用名,捕获应用内打印的日志 'myapp': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, } } }
- 将修改后的代码提交部署到Heroku即可。
使用说明
- 配置生效后,执行
heroku logs --tail即可看到完整的Django运行日志,包含请求记录、报错堆栈、自定义日志内容,和本地运行时输出完全一致 - 如果需要过滤掉Heroku平台日志,仅查看Django日志,可以执行命令:
heroku logs --tail | grep "django"
注意事项
- 生产环境请保持
DEBUG = False,该日志配置在调试模式关闭状态下依然正常生效 - 不要将日志输出到本地文件,Heroku的文件系统是临时的,重启实例后本地文件会丢失,输出到标准输出是唯一稳定的日志采集方式
内容的提问来源于stack exchange,提问作者Joaquin
相关产品推荐
相关产品推荐

