首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Heroku上登录Django

在Heroku上登录Django
EN

Stack Overflow用户
提问于 2013-09-20 23:25:15
回答 4查看 16.1K关注 0票数 29

我知道这个问题已经被问了好几次了,但我就是不能让它起作用。我已经花了半天的时间尝试了几十种组合,现在又试了一次,仍然不起作用。

在我的代码中,我记录了几个部分,比如在一次尝试中--除了或者记录一些来自管理命令的信息。我只是在做一些非常普通的事情,就是在几个本地安装和一些Nginx服务器上工作。

如下所示的python文件:

代码语言:javascript
复制
import logging
logger = logging.getLogger(__name__)
logger.info('some important infos')

使用以下作为最小的settings.py (我尝试了不使用流指示,不指定记录器,使用命名记录器,几乎所有可能的组合,我也尝试了更复杂的组合)

代码语言:javascript
复制
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',
        }
    }
}

然后还简单地从外壳heroku run python进行了测试

代码语言:javascript
复制
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中显示任何内容。

编辑:实际上我有一些条目显示出来,应用程序日志如下,只是不是我的:

代码语言:javascript
复制
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启动。我不记得当时它是否运行良好,新遗物的免费测试期相当短。

嗯,我不知道我还能做什么……谢谢你的任何提示

EN

回答 4

Stack Overflow用户

发布于 2014-01-08 06:44:13

从Django登录Heroku一开始可能很棘手,但实际上设置起来并不是那么可怕。

下面的日志定义(在您的设置文件中)定义了两个格式化程序。详细的一个匹配Heroku本身使用的日志记录格式。它还定义了两个处理程序,一个null处理程序(不需要使用)和一个控制台处理程序-控制台处理程序就是您希望与Heroku一起使用的处理程序。这样做的原因是Heroku上的日志通过一个简单的流记录器工作,将任何输出记录到stdout/stderr。最后,我定义了一个名为testlogger的日志记录器--日志记录定义的这一部分就像日志记录定义一样。

代码语言:javascript
复制
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或更高版本的日志消息。

代码语言:javascript
复制
import logging
logger = logging.getLogger('testlogger')
logger.info('This is a simple log message')
票数 37
EN

Stack Overflow用户

发布于 2019-01-31 00:38:55

在我的例子中,我确实有一个有效的日志记录设置

代码语言:javascript
复制
LOGGING = {...}

不幸的是,它被忽略了,因为在我的设置文件的底部,我调用了

代码语言:javascript
复制
django_heroku.settings(locals())

这会覆盖我的日志设置,因此解决方案是

代码语言:javascript
复制
django_heroku.settings(locals(), logging=False)

这看起来可能会禁用日志记录,但实际上它只是跳过了heroku自己的日志记录配置。

顺便说一句,我会在调试Django日志问题时使用这段代码,因为它或多或少应该始终使用Django默认值:

代码语言:javascript
复制
import logging
logger = logging.getLogger('django.server')
logger.error('some important infos')

请参阅Django's default logging config

然后,您可以更改记录器、消息级别和日志记录设置,以准确地找出问题所在。

票数 13
EN

Stack Overflow用户

发布于 2013-09-21 06:02:47

你需要手动“激活”你的记录器。您可以按模块执行此操作,如“blog.views”。它会提取子模块,所以要记录整个博客应用程序,只需输入' blog‘即可。

如果您将其保留为空,它将记录以前未使用propagate=True (非默认值)处理的所有内容。这还将记录所有的Django,这意味着在调试级别上,您将在日志中获得SQL查询。

代码语言:javascript
复制
'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'blog.views': {
            'handlers': ['console'],
        },
        'blog': {
            'handlers': ['console'],
        },
        '': {
            'handlers': ['console'],
            'level': 'DEBUG',  # Not recommended.
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18920428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档