Django 登录到控制台
Posted
技术标签:
【中文标题】Django 登录到控制台【英文标题】:Django logging to console 【发布时间】:2014-04-03 19:12:52 【问题描述】:我正在尝试设置一个将记录到控制台的记录器(我想要这个,因为我将 Heroku 与 Papertrails(Heroku 的日志记录插件)一起使用,写入控制台的内容将显示在 Papertrails 中,使其可过滤以及所有不错的 Papertrail 功能。)
在设置中,我首先尝试了以下操作:
LOGGING =
'handlers' =
'file':
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'mysite.log',
'formatter': 'verbose'
,
'console':
'level': 'DEBUG',
'class': 'logging.StreamHandler',
,
,
(...)
'loggers'=
(...)
'page_processors':
'handlers': ['console','file'],
'level': 'DEBUG',
(...)
根据 Django 的日志记录页面(对于那些不使用 Mezzanine 的人,page_processors 是 Mezzanine 在您打开页面时运行的内容;您可以将它们视为 Django 的视图,但它们只执行上下文,而不是渲染)。
在 page_processors.py 我有
import logging
logger = logging.getLogger(__name__)
@process_for(MyPage):
def myfunc(request, Page):
logger.info('page_processor logging test')
print 'my page_processor print'
(...)
当我刷新页面时,我看不到记录器,但我看到打印和日志到文件:
[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test
所以我知道逻辑是有效的。谷歌搜索了一下,我发现this 和this page 正好解决了这个问题。他说默认情况下 logging.StreamHandler 记录到 STDERR。如果我们想记录到 STDOUT,您应该将关键字参数“stream”添加到 logging.StreamHandler 构造中,然后像这样配置处理程序:
'handlers':
(...)
'console':
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'stream': sys.stdout
,
事实证明这仍然不起作用,我没有收到任何错误或任何东西,我仍然看到打印和文件日志。只是不是控制台记录器。
发生了什么事?
编辑: 我试过this,没什么区别。
【问题讨论】:
【参考方案1】:以下脚本:
import logging, logging.config
import sys
LOGGING =
'version': 1,
'handlers':
'console':
'class': 'logging.StreamHandler',
'stream': sys.stdout,
,
'root':
'handlers': ['console'],
'level': 'INFO'
logging.config.dictConfig(LOGGING)
logging.info('Hello')
将Hello
写入sys.stdout
,这可以通过将其输出传输到文件来验证。因此,您的问题可能出在其他地方(或者 sys.stdout 可能不是您所期望的)。你可以试试sys.__stdout__
看看是否有什么不同。
【讨论】:
谢谢。 __ stdout __ 不起作用。是的,我可以相信该代码没有任何问题(毕竟,我是从其他地方获取的),但奇怪的是,即使登录到文件也能正常工作。还有其他建议吗? 这似乎没有在服务器 500 错误上记录任何内容。有什么想法吗?【参考方案2】:我终于明白了。这就是发生的事情。
当你使用 getLogger 定义一个记录器时,你给一个记录器一个名字,在这种情况下
logger = logging.getLogger(__name__)
然后您必须定义具有该名称的记录器在 LOGGING 配置中的行为方式。在这种情况下,由于该文件位于模块内,因此记录器的名称变为 myApp.page_processors,而不是 page_processors,因此永远不会调用 LOGGING 字典中名为“page_processors”的记录器。那么为什么记录到文件的工作正常呢?因为在我在代码中显示的 (...) 中,有另一个名为“myApp”的记录器显然被调用,并且该记录器写入文件。
所以这个问题的解决方案就是正确命名记录器:
LOGGING =
# (...)
'loggers':
# (...)
'myApp.page_processors':
'handlers': ['console','file'],
'level': 'DEBUG',
# (...)
【讨论】:
【参考方案3】:我写这篇文章是为了便于理解像我这样的傻瓜。
在settings.py中
LOGGING =
'version': 1,
'disable_existing_loggers': False,
'handlers':
'console':
'class': 'logging.StreamHandler',
,
,
'loggers':
'app_api':
'handlers': ['console'],
'level': 'INFO',
,
,
在您的应用程序视图中的某处
import logging
logger = logging.getLogger('app_api') #from LOGGING.loggers in settings.py
try:
one = 1/0
except Exception as e:
logger.error(e)
【讨论】:
以上是关于Django 登录到控制台的主要内容,如果未能解决你的问题,请参考以下文章
Django 2021年最新版教程29django项目部署到华为云(ubuntu virtualenv mysql方式)