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 登录到控制台的主要内容,如果未能解决你的问题,请参考以下文章

腾讯云python系列之部署Django流程

Django用Eclipse编写一个登录界面

Django没有将表单提交到数据库

Django 注册 url 重定向

Django 2021年最新版教程29django项目部署到华为云(ubuntu virtualenv mysql方式)

如何为访问控制编写 Django 模板标签?