So che questa è già una risposta risolta, ma come per django> = 1.3 c'è una nuova impostazione di registrazione.
Lo spostamento dal vecchio al nuovo non è automatico, quindi ho pensato di scriverlo qui.
E naturalmente il check-out the django doc per altri ancora.
Questa è la conf base, creato da default con django-admin createproject v1.3 - 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 Python logging dictConfig, che determina i seguenti blocchi:
faccio di solito, almeno questo:
- aggiungere un file di log
- configurare le mie applicazioni di scrivere 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 request exceptions are now always logged e Ticket #16288:
ho aggiornato il conf campione sopra per includere esplicitamente il filtro corretto per mail_admins in modo che, per impostazione predefinita, messaggi di posta elettronica non vengono inviati quando il debug è True.
Si dovrebbe aggiungere un filtro:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
e applicarlo al gestore mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Altrimenti il django.core.handers.base.handle_uncaught_exception
non passa errori al logger 'django.request' se le impostazioni .DEBUG è vero.
Se non si esegue questa operazione in Django 1.5 si otterrà un DeprecationWarning
: Non ci sono filtri definiti sulla gestore registrazione dei 'mail_admins': aggiunta implicita filtrare debug-falso-only
ma le cose funzioneranno correttamente ENTRAMBE in django 1.4 e django 1.5.
** ** di modifica fine
Questo conf è fortemente ispirato dalla conf campione nel doc Django, ma aggiungendo la parte del file di registro.
spesso anche effettuare le seguenti operazioni:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Poi nel mio codice python ho sempre aggiungere un NullHandler nel caso in cui non conf registrazione è definito alcun tipo. Questo evita avvisi per nessun gestore specificato. Particolarmente utile per librerie che non sono necessariamente chiamato solo a 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 aiuti!
È possibile trovare il seguente screencast utile: http://ericholscher.com/blog/2008/aug/29/screencast-2-logging-fun-and-profit/. Inoltre, un miglior supporto per l'accesso a Django è stato proposto da Simon Willison (vedi http://simonwillison.net/2009/Sep/28/ponies/). –
@Dominic Rodger - È già possibile eseguire la registrazione flessibile di app in Django, la proposta di Simon principalmente per facilitare la registrazione negli interni di Django.C'è del lavoro in Python per aggiungere la configurazione basata sul dizionario alla registrazione Python, da cui Django potrebbe trarne beneficio. –