2016-08-01 16 views
3

Djangoのログ記録に問題があります。私はロギングに関するPythonと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) 

ジャンゴ/ utilsパッケージに指定されている、私はDjangoのデフォルトのロギングの設定を使用しています:起動するには、私はちょうど私のDjangoの開発サーバは、私はこの単純なビューを実行したときに実行されているコンソールにメッセージをログに記録しようとしています私の設定ファイル内の/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のロガーに衝突すると思います。

ありがとうございました。

FOLLOW UP 私は、デフォルトを追加することによって、「__name__」引数を使用してロガーを作成するときにトリガーされる「キャッチオール」ロガー、この問題を解決:logger = logging.getLogger(__name__)を呼び出すと、原因

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

答えて

3

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 \ _ \ _"を使用することが示されているので、デフォルトの「catch-all」ロガーの作成について議論すると思います。 – William

+1

はい私はあなたに同意し、なぜドキュメントにそのことが言及されていないのか、なぜ「キャッチオール」ロガーがデフォルトで追加されたのか不思議に思っています。 – rafalmp

関連する問題