Je sais que c'est déjà une réponse résolue, mais selon django> = 1.3, il y a un nouveau paramètre de journalisation.
Passer de l'ancien au nouveau n'est pas automatique, alors j'ai pensé l'écrire ici.
Et bien sûr, consultez la documentation django pour en savoir plus.
Ceci est la configuration de base, créée par défaut avec django-admin createproject v1.3 - le kilométrage peut changer avec les dernières versions de 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,
}
}
}
Cette structure est basée sur la journalisation Python standard dictConfig , qui dicte les blocs suivants:
Je fais généralement au moins ceci:
- ajouter un fichier .log
- configurer mes applications pour écrire dans ce journal
Ce qui se traduit par:
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'
},
}
Éditer
Les exceptions de demande sont désormais toujours enregistrées et le ticket n ° 16288 :
J'ai mis à jour l'exemple de configuration ci-dessus pour inclure explicitement le filtre correct pour mail_admins afin que, par défaut, les e-mails ne soient pas envoyés lorsque le débogage a la valeur True.
Vous devez ajouter un filtre:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
et appliquez-le au gestionnaire mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Sinon, django.core.handers.base.handle_uncaught_exception
ne transmet pas les erreurs à l'enregistreur 'django.request' si settings.DEBUG est True.
Si vous ne le faites pas dans Django 1.5, vous obtiendrez un
DeprecationAvertissement: Vous n'avez pas de filtre défini sur le gestionnaire de journalisation 'mail_admins': ajout d'un filtre implicite debug-false-only
mais les choses fonctionneront toujours correctement LES DEUX dans django 1.4 et django 1.5.
** fin de modification **
Cette conf est fortement inspirée de l'exemple de conf dans la doc django, mais en ajoutant la partie du fichier journal.
Je fais souvent aussi ce qui suit:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Ensuite, dans mon code python, j'ajoute toujours un NullHandler au cas où aucune configuration de journalisation n'est définie. Cela évite les avertissements pour aucun gestionnaire spécifié. Particulièrement utile pour les bibliothèques qui ne sont pas nécessairement appelées uniquement dans 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.')
J'espère que cela t'aides!