2016-08-01 58 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