Sé que ya se trata de una respuesta resuelta, pero según django> = 1.3 hay una nueva configuración de registro.
Pasar de viejo a nuevo no es automático, así que pensé que lo escribiría aquí.
Y, por supuesto, salida the django doc para algunos más.
Ésta es la conf básico, creado por defecto con v1.3 django-admin createproject - kilometraje podría cambiar con las últimas versiones 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,
}
}
}
Esta estructura se basa en el estándar Python logging dictConfig, que dicta el siguiente bloques:
por lo general lo hago por lo menos esto:
- añadir un archivo .log
- configurar mis aplicaciones escribir en este registro
que se traduce en:
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'
},
}
edición
Ver request exceptions are now always logged y Ticket #16288:
He actualizado el conf muestra anterior para incluir explícitamente el filtro correcto para mail_admins de manera que, por defecto, los correos electrónicos no se envían cuando depuración es verdadera.
Usted debe agregar un filtro:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
y aplicarlo al controlador de mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
lo contrario, el django.core.handers.base.handle_uncaught_exception
no pasa errores al registrador 'django.request' si los ajustes .DEBUG es verdadero.
Si no se hace esto en Django 1.5 podrás obtener una DeprecationWarning
: No tiene filtros definidos en el manejador de registro de los '' mail_admins: Adición implícita de depuración de falso único filtro
pero las cosas seguirán funcionando correctamente tanto en django 1.4 como en django 1.5.
** ** final de edición
Eso conf está fuertemente inspirado en el conf muestra en el documento de Django, pero la adición de la parte del archivo de registro.
A menudo también haga lo siguiente:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Luego, en mi código Python siempre añadir un NullHandler en caso de que no conf registro se define en absoluto. Esto evita advertencias para ningún controlador especificado. Especialmente útil en las librerías que no necesariamente se llama sólo en 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.')
Espero que esto ayude!
Puede ser útil el siguiente screencast útil - http://ericholscher.com/blog/2008/aug/29/screencast-2-logging-fun-and-profit/. Además, Simon Willison ha propuesto un mejor soporte para iniciar sesión en Django (ver http://simonwillison.net/2009/Sep/28/ponies/). –
@Dominic Rodger: Ya puedes hacer un registro flexible de aplicaciones en Django, la propuesta de Simon principalmente para facilitar el inicio de sesión en Django internal.Se está trabajando en Python para agregar configuración basada en diccionario al registro de Python, del cual Django podría beneficiarse. –