我在Heroku上创建了一个应用程序,然后将我的Django应用程序推送到它。
我使用heroku logs --tail
监控日志,实时查看日志。
然后,在我的settings.py
中,我有以下内容:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' +
'pathname=%(pathname)s lineno=%(lineno)s ' +
'funcname=%(funcName)s %(message)s'),
'datefmt': '%Y-%m-%d %H:%M:%S'
},
'simple': {
'format': '%(levelname)s %(message)s'
}
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'verbose',
'stream': sys.stdout,
}
},
'loggers': {
'MYAPP': {
'handlers': ['console'],
'level': 'INFO',
}
}
}
然后,当我想记录某些内容时,我使用以下内容:
import logging
import sys
logger = logging.getLogger('MYAPP')
logger.info('My message here...')
sys.stdout.flush()
但它没有反映在我的日志中。
我的Procfile
:
web: gunicorn myapp.wsgi --log-file=-
编辑:奇怪的是,当我定义我的日志配置和logging.getLogger('django')
时,我实际上可以将“myapp”更改为“django”,这样我就可以在日志中看到任何使用print
的内容,但没有任何内容从我定义的格式化记录器。
我甚至为我的暂存环境设置了PYTHONUNBUFFERED=true
和DEBUG=1
,但在使用foreman start web
本地版本时,我看不到任何记录。
造成这种情况的原因是什么?如何在Heroku中查看我的日志?
答案 0 :(得分:8)
你的Procfile可能有问题:
如果你想让gunicorn登录到stdout,你必须根据this answer使用--logfile=-
命令行选项(你错过了=
!)。
所以你的整个Procfile应该是这样的:
web: gunicorn myapp.wsgi --log-file=-
编辑:
由于print语句适合您,但日志记录不适用,因此您的日志记录设置可能有问题。确保在启动应用程序期间设置日志记录(您在代码中调用dictConfig的位置?):
import logging
logging.config.dictConfig(LOGGING)
logger = logging.getLogger('MYAPP')
logger.info("Just testing")
答案 1 :(得分:0)
如前面的回复中所述,应在应用的入口点设置记录器。对于使用gunicorn的基于django的Web服务器,该入口点很可能是wsgi.py
文件。
尝试将所需的配置添加到该文件,例如设置全局基本记录器:
import logging
import os
from dj_static import Cling
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "path.to.settings.py")
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(name)s %(levelname)-8s %(message)s",
)
答案 2 :(得分:0)
我认为,如果您放下logger.error
,您会看到一些东西。
我遇到了同样的问题,结果证明heroku的设置工具破坏了先前存在的LOGGING
设置。您正在使用的记录器未在django中注册,而是使用python的标准记录系统以自己的方式进入控制台。
尝试做:
django_heroku.settings(locals(), logging=False)
或者更好的是,由于此软件包不再得到维护,因此不再使用它。