Django登录到控制台

时间:2014-03-02 23:04:35

标签: python django logging

我正在尝试设置一个记录器,它将登录到控制台(我想要这个,因为我正在使用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

因此我知道逻辑正在发挥作用。谷歌搜索后,我发现thisthis page正好解决了这个问题。他说默认情况下logging.StreamHandler会记录到STDERR。如果我们想要登录STDOUT,你应该将关键字参数'stream'添加到logging.StreamHandler构造中,然后配置处理程序:

'handlers':{
    (...)
    'console':{
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'stream': sys.stdout
    },
}

原来这仍然不起作用,我没有得到任何错误或任何东西,我仍然看到打印和文件日志。只是没有控制台记录器。

发生了什么事?

编辑: 我试过this,没有什么区别。

3 个答案:

答案 0 :(得分:29)

我终于明白了。这就是发生的事情。

使用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',
        }
    }
    # (...)
}

答案 1 :(得分:19)

以下脚本:

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__来查看是否会产生影响。

答案 2 :(得分:0)

我写这篇文章是为了让我这样的傻瓜容易理解。

在settings.py

-0000-1000-8000-00805f9b34fb

应用程序视图中的某处

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'app_api': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
    }