在Heroku上登录Django没有出现

时间:2015-08-26 18:28:33

标签: python django logging heroku

我在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=trueDEBUG=1,但在使用foreman start web本地版本时,我看不到任何记录。

造成这种情况的原因是什么?如何在Heroku中查看我的日志?

3 个答案:

答案 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)

或者更好的是,由于此软件包不再得到维护,因此不再使用它。