提问者:小点点

Django日志记录到控制台


我正在尝试设置一个日志记录器,它将登录到控制台(我想要这个,因为我正在使用Heroku和Papertrail(Heroku的日志插件),写入控制台的内容将显示在Papertrail中,使其可过滤,并具有所有良好的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的日志页面(对于那些不使用夹层的人来说,page_processors是当你打开页面时夹层运行的;你可以把它们想象成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

所以我知道逻辑在起作用。在谷歌搜索了一下之后,我发现这个页面正好解决了这个问题。他说默认情况下是日志记录。StreamHandler将日志记录到STDERR。如果我们想登录到标准输出,您应该在日志中添加关键字参数“stream”。StreamHandler构造,并将处理程序配置为:

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

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

怎么回事啊?

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


共3个答案

匿名用户

我终于明白了。事情是这样的。

在本例中,使用getLogger定义记录器时,为记录器指定一个名称

logger = logging.getLogger(__name__)

然后,您必须定义具有该名称的记录器在日志记录配置中的行为。在本例中,由于该文件位于模块内,记录器的名称将变为myApp。page_处理器,而不是page_处理器,因此日志记录dict中名为“page_处理器”的记录器永远不会被调用。那么,为什么文件的日志记录工作正常呢?因为在(…)我在代码中显示了另一个名为“myApp”的记录器,它显然会被调用,并写入文件。

因此,这个问题的解决方案就是正确命名记录器:

LOGGING = {
    # (...)
    'loggers': {
        # (...)
        'myApp.page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    # (...)
}

匿名用户

以下脚本:

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

匿名用户

我写这个是为了像我这样容易理解的傻瓜。

在设置中。派克

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)