2014-03-02 75 views
20

我试图建立一个记录器将登录到控制台(我想这是因为我使用的是Papertrails的Heroku(Heroku的日志记录插件)和东西写到控制台将在Papertrails显示,使其过滤和一切好Papertrail功能)Django的登录到控制台

在设置我第一次尝试以下操作:

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是当你打开一个页面时,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 

等我知道这个逻辑在起作用。在google搜索了一下之后,我发现了thisthis page恰恰解决了这个问题。他说默认logging.StreamHandler记录到STDERR。如果我们想登录到STDOUT你应该关键字参数“流”添加到logging.StreamHandler结构,因此配置处理器为这样:

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

原来,这仍然无法正常工作,而且我不没有任何错误或任何错误,我仍然可以看到打印和文件日志。只是不是控制台记录器。

发生了什么事?

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

回答

19

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

当你定义使用getLogger一个记录器,你给一个记录器的名称,在这种情况下

logger = logging.getLogger(__name__) 

,然后你必须定义一个同名的记录日志配置的行为。在这种情况下,由于该文件位于模块内,因此记录器的名称将变为myApp.page_processors,而不是page_processors,因此LOGGING字典中名为“page_processors”的记录器不会被调用。那么为什么记录到文件工作?因为在代码中显示的(...)中有另一个名为'myApp'的记录器,显然它被调用,而那个记录器写入文件。

所以,要解决这个问题,只是适当地命名记录:

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

下面的脚本:

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

写入Hellosys.stdout,如可以通过它的输出管道连接到文件进行验证。所以你的问题可能在别的地方(或者可能是你想要的sys.stdout)。你可以试着用sys.__stdout__来看看这是否有所作为。

+0

感谢。 __ stdout __不起作用。是的,我可以相信这个代码没什么问题(毕竟我是从其他地方拿来的),但奇怪的是,即使是登录文件也可以。还有其他建议吗? – oneloop