我正在尝试设置一个日志记录器,它将登录到控制台(我想要这个,因为我正在使用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
},
}
原来这仍然不起作用,我没有得到任何错误或任何东西,我仍然看到打印和文件日志。只是不是控制台记录器。
怎么回事啊?
编辑:我试过了,没什么区别。
我终于明白了。事情是这样的。
在本例中,使用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)