Python 在Heroku上登录Django未出现
我已经在Heroku上创建了一个应用程序,我将我的Django应用程序推到它上面 我使用heroku logs--tail来监视日志,以实时查看它们 然后,在我的Python 在Heroku上登录Django未出现,python,django,logging,heroku,Python,Django,Logging,Heroku,我已经在Heroku上创建了一个应用程序,我将我的Django应用程序推到它上面 我使用heroku logs--tail来监视日志,以实时查看它们 然后,在我的设置.py中,我有以下内容: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': ('%(asctime)s [%(proce
设置.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()
然后,当我想记录一些东西时,我使用以下命令:
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中看到我的日志?您的程序文件可能在此处出错: 如果要将gunicorn日志记录到标准输出,则必须根据使用
--logfile=-
命令行选项(缺少=
!)
因此,您的整个Procfile应该如下所示:
web:gunicorn myapp.wsgi——日志文件=-
编辑:
由于打印语句对您有效,但日志记录不起作用,因此日志记录设置可能有问题。确保在应用程序启动期间设置了日志记录(您在代码中的什么位置调用dictConfig?)
您的
Procfile
和LOGGING
配置看起来不错。Django会在导入应用程序之前配置日志记录器,因此,如果您甚至在之前尝试登录(例如,从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': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
}
},
'loggers': {
'ex_logger': {
'handlers': ['console', ],
'level': 'INFO',
}
}
}
将以下内容添加到settings.py
不会记录:
import logging
logger = logging.getLogger('ex_logger')
logger.info("core.settings logger") # won't work
from django.http import HttpResponse
import logging
logger = logging.getLogger('ex_logger')
logger.info("core.views logger") # should work
def url_please(request):
logger.info("path: %s" % request.path) # should work
return HttpResponse(request.path)
添加到视图.py
应记录:
import logging
logger = logging.getLogger('ex_logger')
logger.info("core.settings logger") # won't work
from django.http import HttpResponse
import logging
logger = logging.getLogger('ex_logger')
logger.info("core.views logger") # should work
def url_please(request):
logger.info("path: %s" % request.path) # should work
return HttpResponse(request.path)
正如前面的回复中所述,应该在应用程序的入口点设置记录器。对于使用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",
)
我想如果你放下一个
logger.error
你会看到一些东西
我也遇到了同样的问题,结果是heroku的设置工具破坏了预先存在的日志记录设置。您正在使用的记录器没有向django注册,而是使用python的标准日志系统自行进入控制台
试着做:
django\u heroku.settings(locals(),logging=False)
或者更好的是,不要再使用它了,因为这个软件包已经不再维护。你的文件是什么?使用Gunicorn,您可以指定日志级别和日志文件。如何在Heroku上运行应用程序?使用uWSGI或Gunicorn或其他东西?我的Procfile
是:web:Gunicorn myapp.wsgi--log file-
您是否尝试将console
的level
选项更改为DEBUG
?不,但我发送的信息级别应该更高,这似乎没有帮助。我仍然没有在heroku logs--tail
shell中看到实时记录的输出。@lollercoaster您使用的是哪个版本的Gunicorn?从R20版本开始,默认情况下它将再次记录到标准输出。因此,您根本不需要命令行标志。还要尝试添加--log level=debug
,以确保这不是问题所在。我使用的是gunicorn==19.3.0
,这是heroku对django堆栈使用的。--log level=debug
东西似乎显示了更多的消息,但没有显示我正在记录的消息,因此无法解决问题。此外,我现在看到的是Heroku心跳每秒都在更新,比如2015-09-07T18:57:05.712965+00:00应用程序[web.1]:[2015-09-07 18:57:05+0000][3][DEBUG]2个worker
。但我没有在我的应用程序中登录任何东西。@lollercoaster hm奇怪。试着做一个理智的检查:在你的应用程序启动的某个地方放上“打印”只是测试“,看看这是否会出现在Heroku日志中。如果是这样,那么您就知道您的日志记录设置不知何故被破坏了。如果没有,那可能是别的原因。