2016-08-01 87 views
3

我在使用Django日志时遇到了麻烦。我已经阅读了关于日志的Python和Django文档,但是我仍然没有看到我做错了什么。一开始,我只是想记录消息的地方,当我执行这个简单的观点我的Django开发服务器运行该控制台:这个Django日志为什么不能工作?

# demo/views.py 
import logging 
logger = logging.getLogger(__name__) 

def demo_logging(request, template): 
    logger.error("Got some error") 
    return render(request, template) 

我使用Django默认的日志记录设置为在Django/utils的规定/log.py在我的设置文件,这样我(希望)确切地知道发生了什么(这,显然我没有):

# settings.py 
DEBUG = True 
... 
LOGGING_CONFIG = None 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse', 
     }, 
     'require_debug_true': { 
      '()': 'django.utils.log.RequireDebugTrue', 
     }, 
    }, 
    'handlers': { 
     'console': { 
      'level': 'INFO', 
      'filters': ['require_debug_true'], 
      'class': 'logging.StreamHandler', 
     }, 
     'null': { 
      'class': 'logging.NullHandler', 
     }, 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['console'], 
     }, 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': False, 
     }, 
     'django.security': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': False, 
     }, 
     'py.warnings': { 
      'handlers': ['console'], 
     }, 
    } 
} 
import logging.config 
logging.config.dictConfig(LOGGING) 

当我执行来看,我没有看到任何在控制台消息除外,

No handlers could be found for logger "demo.views" 

我不明白我做错了什么。我会认为调用logger.error会击中连接到已定义的控制台处理程序的django记录器。

谢谢。

跟进 我加入了默认,“无所不包”,将创建使用“__name__”参数记录仪时被触发记录仪解决了这个问题:

'loggers': { 
    '': { 
     'handlers': ['console'], 
    }, 
    ... 

回答

3

调用logger = logging.getLogger(__name__)导致logging模块搜索名为模块的记录器(demo.views);因为您没有使用该名称定义的记录器,所以失败。要只需登录到控制台,您可以使用您LOGGING配置'loggers'键定义的django记录:

import logging 
logger = logging.getLogger('django') 

def demo_logging(request, template): 
    logger.error("Got some error") 
    return render(request, template) 
+1

这是真实的。但是,我刚刚发现的一种更好的方法可能是添加如上所示的默认记录器。鉴于Django doc示例在指定记录器时显示使用“\ _ \ _ name \ _ \ _”,您会认为它将讨论创建默认的“全部捕获”记录器。 – William

+1

是的,我同意你的看法,让人奇怪为什么文档没有提到这个,或者为什么不是默认添加的“全部”记录器。 – rafalmp