私はこれがすでに解決された答えであることを知っていますが、django> = 1.3に従って、新しいロギング設定があります。
古いものから新しいものへの移行は自動ではないので、ここに書き留めておきます。
そしてもちろん、django docをチェックアウトしてください。
これは基本的にdjango-admin createproject v1.3で作成されたconfです-djangoの最新バージョンでは走行距離が変わる可能性があります:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}
この構造は、次のブロックを指示する標準のPythonロギングdictConfigに基づいています。
私は通常、少なくともこれを行います:
- .logファイルを追加する
- このログに書き込むようにアプリを構成する
これは次のように変換されます:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# I always add this handler to facilitate separating loggings
'log_file':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
'maxBytes': '16777216', # 16megabytes
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
'handlers': ['log_file'],
'level': 'INFO',
'propagate': True,
},
},
# you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
'root': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO'
},
}
編集する
参照要求の例外は、現在常にログインしているとチケット#16288:
上記のサンプル設定を更新して、mail_adminsの正しいフィルターを明示的に含めるようにしたので、デフォルトでは、debugがTrueの場合にメールは送信されません。
フィルターを追加する必要があります:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
そして、それをmail_adminsハンドラーに適用します。
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
それ以外の場合、django.core.handers.base.handle_uncaught_exception
settings.DEBUGがTrueの場合、エラーは 'django.request'ロガーに渡されません。
Django 1.5でこれを行わないと、
DeprecationWarning: 'mail_admins'ロギングハンドラーにフィルターが定義されていません:暗黙のdebug-false-onlyフィルターを追加しています
ただし、django 1.4とdjango 1.5のどちらでも、正常に機能します。
**編集を終了**
そのconfはdjango docのサンプルconfに強く触発されていますが、ログファイルの部分が追加されています。
私はしばしば次のことも行います:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
次に、私のPythonコードで、ロギング設定がまったく定義されていない場合に備えて、常にNullHandlerを追加します。これにより、ハンドラが指定されていない場合の警告が回避されます。必ずしもDjangoでのみ呼び出されるわけではないライブラリ(ref)に特に有用
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
def emit(self, record):
pass
nullhandler = logger.addHandler(NullHandler())
# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...
[...]
logger.warning('etc.etc.')
お役に立てれば!