我正在尝试设置一个将记录到控制台的记录器(我想要这样做,因为我将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的 View ,但它们仅用于上下文,而不用于渲染)。

在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恰好解决了这个问题。他说默认情况下记录日志.StreamHandler记录到STDERR。如果我们要登录到STDOUT,则应将关键字参数'stream'添加到logging.StreamHandler构造中,然后按以下方式配置处理程序:
'handlers':{
    (...)
    'console':{
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'stream': sys.stdout
    },
}

事实证明,这仍然行不通,并且我没有收到任何错误或任何东西,并且仍然看到了打印和文件日志。只是不是控制台记录器。

这是怎么回事?

编辑:
我尝试了this,没有任何区别。

最佳答案

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

在使用getLogger定义记录器时,您将为记录器命名,在这种情况下

logger = logging.getLogger(__name__)

然后必须定义具有该名称的记录器在LOGGING配置中的行为。在这种情况下,由于该文件位于模块内部,因此记录器的名称为myApp.page_processors,而不是page_processors,因此永远不会调用LOGGING dict中名为“page_processors”的记录器。那么,为什么记录到文件的工作正常?因为在代码中显示的(...)中,有另一个名为“myApp”的记录器,显然它被调用了,并写入了文件。

因此,此问题的解决方案是正确命名记录器:
LOGGING = {
    # (...)
    'loggers': {
        # (...)
        'myApp.page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    # (...)
}

10-08 01:55