Django将日志记录到控制台

39

我正在尝试设置一个记录器,它将记录到控制台(我想这样做是因为我正在使用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,应该在logging.StreamHandler构造函数中添加关键字参数'stream',并将处理程序配置为:

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

原来这还是不行,我没有收到任何错误提示,仍然能看到打印和文件日志,只是控制台记录器没有了。
发生了什么?
编辑: 我尝试了this,但没有任何改变。
3个回答

46

我终于明白了,这是发生了什么。

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

32

下面的脚本:

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不起作用。是的,我相信代码没有问题(毕竟,我从别处拿来的),但奇怪的是即使记录到文件也可以工作。还有其他建议吗? - user1950164
这似乎没有记录服务器500错误。 有什么想法吗? - cammil

15

我正在为像我这样的容易理解的新手编写此内容。

在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接