So che questa è già una risposta risolta, ma secondo django> = 1.3 c'è una nuova impostazione di registrazione.
Passare dal vecchio al nuovo non è automatico, quindi ho pensato di scriverlo qui.
E ovviamente controlla il django doc per ulteriori informazioni.
Questa è la configurazione di base, creata per impostazione predefinita con django-admin createproject v1.3 - il chilometraggio potrebbe cambiare con le ultime versioni di 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,
}
}
}
Questa struttura si basa sullo standard di registrazione Python dictConfig , che detta i seguenti blocchi:
Di solito faccio almeno questo:
- aggiungi un file .log
- configurare le mie app per scrivere in questo registro
Che si traduce in:
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'
},
}
modificare
Vedi le eccezioni alle richieste ora sono sempre registrate e il biglietto n. 16288 :
Ho aggiornato la configurazione di esempio sopra per includere esplicitamente il filtro corretto per mail_admins in modo che, per impostazione predefinita, le e-mail non vengano inviate quando il debug è True.
Dovresti aggiungere un filtro:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
e applicalo al gestore mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Altrimenti django.core.handers.base.handle_uncaught_exception
non passa gli errori al logger "django.request" se settings.DEBUG è True.
Se non lo fai in Django 1.5 otterrai un file
Avviso: non sono stati definiti filtri nel gestore di registrazione "mail_admins": aggiunta di un filtro di solo debug implicito
ma le cose continueranno a funzionare correttamente SIA in django 1.4 che in django 1.5.
** fine modifica **
Questa configurazione è fortemente ispirata all'esempio di configurazione nel documento django, ma aggiungendo la parte del file di registro.
Spesso faccio anche quanto segue:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Quindi nel mio codice Python aggiungo sempre un NullHandler nel caso in cui non sia definita alcuna configurazione di registrazione. Questo evita avvisi per nessun gestore specificato. Particolarmente utile per librerie che non sono necessariamente chiamate solo in 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.')
Spero che questo ti aiuti!