我知道这个问题已被问过几次,但我无法让它发挥作用。我已经花了半天时间尝试了几十种组合,现在再次尝试它仍然无效。
在我的代码中,我正在记录几个部分,例如在try-except中或从管理命令记录一些信息。我正在做非常正常的事情,那就是在几个本地安装和一些Nginx服务器上工作。
像这样的python文件:
import logging
logger = logging.getLogger(__name__)
logger.info('some important infos')
跟随最小的settings.py(我尝试没有流指示,没有指定记录器,使用命名记录器,几乎所有可能的组合,我也尝试了更复杂的组合)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'stream': sys.stdout
}
},
'loggers': {
'django': {
'handlers': ['console'],
'propagate': True,
'level': 'INFO',
},
'': {
'handlers': ['console'],
'level': 'INFO',
}
}
}
然后还只是从shell heroku run python
import logging
level = logging.INFO
handler = logging.StreamHandler()
handler.setLevel(level)
handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
logger = logging.getLogger('info')
logger.addHandler(handler)
logger.setLevel(level) #even if not required...
logger.info('logging test')
最后一个可能在控制台中显示为“print”语句,但是既不在这里也不在命令或服务器中,heroku logs
中没有任何内容显示....
编辑:实际上我有一些条目显示,应用程序日志如下,只是不是我的:
2013-09-20T15:00:16.405492+00:00 heroku[run.2036]: Process exited with status 0
2013-09-20T15:00:17+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_OLIVE sample[...]
2013-09-20T14:59:47.403049+00:00 heroku[router]: at=info method=GET path=/
2013-09-20T14:59:16.304397+00:00 heroku[web.1]: source=web.1 dyno=heroku [...]
我还尝试使用多个插件查找条目。我刚开始使用newrelic,我也从WSGI初创公司停用了。我不记得当时它是否运作良好,newrelic的免费测试时间相当短。
好吧,我不知道我还能尝试什么...感谢任何提示
答案 0 :(得分:24)
从Django登录Heroku起初可能很棘手,但实际上设置并不是那么可怕。
以下日志记录定义(进入您的设置文件)定义了两个格式化程序。详细信息与Heroku本身使用的日志记录格式相匹配。它还定义了两个处理程序,一个空处理程序(不应该使用)和一个控制台处理程序 - 控制台处理程序是你想要与Heroku一起使用的。原因是登录Heroku的工作原理是一个简单的流记录器,记录输出到stdout / stderr的任何输出。最后,我定义了一个名为testlogger的记录器 - 记录定义的这部分与记录定义的正常情况一样。
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': {
'testlogger': {
'handlers': ['console'],
'level': 'INFO',
}
}
}
接下来,如何使用它。在这个简单的例子中,您可以在Django项目的任何其他文件中执行以下操作,以写入我们定义的特定记录器(testlogger
)。请记住,通过我们的设置文件中的记录器定义,将输出任何日志消息INFO
或更高版本。
import logging
logger = logging.getLogger('testlogger')
logger.info('This is a simple log message')
答案 1 :(得分:3)
就我而言,我确实有一个有效的日志记录设置
LOGGING = {...}
不幸的是,它被忽略了,因为在我的设置文件的底部,我正在调用
django_heroku.settings(locals())
这是在覆盖我的日志记录设置,因此解决方案是
django_heroku.settings(locals(), logging=False)
这似乎可能会禁用日志记录,但实际上只是跳过了Heroku自己的日志记录配置。
作为旁注,我将在调试Django日志记录问题时使用此代码,因为它应该或多或少始终与Django默认值一起工作:
import logging
logger = logging.getLogger('django.server')
logger.error('some important infos')
请参见Django's default logging config
然后您可以更改记录器,消息级别和记录设置,以准确地找出问题所在。
答案 2 :(得分:2)
您需要手动“激活”您的记录器。您可以在每个模块中执行此操作,例如“blog.views”。它将获取子模块,因此要记录整个博客应用程序,只需输入“博客”。
如果将其留空,它将记录之前未处理的所有内容,并使用propagate = True(不是默认值)。这也将记录所有Django,这意味着在调试级别,您将在日志中获得SQL查询。
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'blog.views': {
'handlers': ['console'],
},
'blog': {
'handlers': ['console'],
},
'': {
'handlers': ['console'],
'level': 'DEBUG', # Not recommended.
}
}
答案 3 :(得分:0)
我遇到了同样的问题,即自定义记录器没有被Django捕获,因此它只会显示我的ERROR
级消息,而没有通过Django记录系统。格式化程序等不会对输出的消息产生任何影响,并且我根本无法显示INFO
级的消息。
我终于找到了罪魁祸首,它似乎是heroku的django设置工具本身。如果您查看其中的源代码,就会看到它安装了testlogger
并且没有合并到您可能已经设置的自定义记录器中。
解决方案是像这样进行heroku调用:
django_heroku.settings(locals(), logging=False)
或者更好的是,由于此软件包不再得到维护,因此不再使用它。