我正在尝试设置一个记录器,它将登录到控制台(我想要这个,因为我正在使用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
因此我知道逻辑正在发挥作用。谷歌搜索后,我发现this和this page正好解决了这个问题。他说默认情况下logging.StreamHandler会记录到STDERR。如果我们想要登录STDOUT,你应该将关键字参数'stream'添加到logging.StreamHandler构造中,然后配置处理程序:
'handlers':{
(...)
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'stream': sys.stdout
},
}
原来这仍然不起作用,我没有得到任何错误或任何东西,我仍然看到打印和文件日志。只是没有控制台记录器。
发生了什么事?
编辑: 我试过this,没有什么区别。
答案 0 :(得分:29)
我终于明白了。这就是发生的事情。
使用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',
}
}
# (...)
}
答案 1 :(得分:19)
以下脚本:
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__
来查看是否会产生影响。
答案 2 :(得分:0)
我写这篇文章是为了让我这样的傻瓜容易理解。
在settings.py
-0000-1000-8000-00805f9b34fb
应用程序视图中的某处
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'app_api': {
'handlers': ['console'],
'level': 'INFO',
},
},
}