我正在try 设置一个日志(log)记录器,它将登录到控制台(我想要这个,因为我正在使用Heroku和Papertrail(Heroku的日志(log)插件),写入控制台的内容将显示在Papertrail中,使其可过滤,并具有所有良好的Papertrail功能.)

在设置中,我首先try 了以下设置:

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的日志(log)记录页面(对于那些不使用Mezzanine的人,每当您打开页面时,Mezzanine都会运行Page_Processor;您可以认为它们类似于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'
    (...)

当我刷新页面时,我看不到记录器,但我看到打印和文件日志(log):

[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test

所以我知道逻辑在起作用.在谷歌搜索了一下之后,我发现thisthis page正好解决了这个问题.他说默认情况下是日志(log)记录.StreamHandler将日志(log)记录到STDERR.如果我们想登录到STDOUT,你应该在日志(log)中添加关键字参数"stream".StreamHandler构造,并将处理程序配置为:

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

结果发现这仍然不起作用,我没有收到任何错误或任何信息,而且我仍然可以看到打印和文件日志(log).只是不是控制台记录器.

到底怎么回事?

编辑: 我试了this次,没什么不同.

推荐答案

我终于明白了.下面是发生的事情.

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

logger = logging.getLogger(__name__)

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

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

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

Django相关问答推荐

如何在Django REST框架中使用FactoryBoy创建不同的项目

Django ORM ForeignKey查询使用注释设置输出

Django中每个类型/代理的最新行

情节主题更改问题

在 Django 4.1 中提交表单之前显示数据

Django 表单字段必填和可选配置

如何将 ManyToManyField 与另一个 ManyToManyField 进行比较

Django 模板:翻译带有 HTML 的文本块的最佳实践

Django 模板文件夹

使用基于类的 UpdateView 在 Django 中更新用户模型

(fields.E300) 字段定义与模型的关系,该模型要么未安装,要么是抽象的

在生产中使用 Django 中的 SQLite?

使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败

如何将我的上下文变量传递给 Django 中的 javascript 文件?

Django ALLOWED_HOSTS IP 范围

Django 和 VirtualEnv 开发/部署最佳实践

过滤 Django 数据库中包含数组中任何值的字段

python/django中setattr和对象操作的区别

使用 request.user 的 Django 和中间件始终是匿名的

django rest 框架:从序列化程序 validate() 方法设置字段级错误