Django登录Heroku

时间:2013-09-20 15:25:15

标签: python django logging heroku

我知道这个问题已被问过几次,但我无法让它发挥作用。我已经花了半天时间尝试了几十种组合,现在再次尝试它仍然无效。

在我的代码中,我正在记录几个部分,例如在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的免费测试时间相当短。

好吧,我不知道我还能尝试什么...感谢任何提示

4 个答案:

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

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