diff --git a/config/settings/base.py b/config/settings/base.py index ec27644..8e1c62a 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -158,3 +158,70 @@ MEDIA_ROOT = BASE_DIR / 'media' EMAIL_USE_TLS = True EMAIL_USE_SSL = False + + +# Logging +# https://docs.djangoproject.com/en/6.0/topics/logging/ + +# Se define entero (en vez de dejar el DEFAULT_LOGGING de Django) porque ese +# default, con DEBUG=False, solo engancha un handler de consola cuando +# DEBUG=True y manda los errores (django.request) por email a ADMINS cuando +# DEBUG=False; aquí ni ADMINS ni un EMAIL_HOST de verdad están configurados +# (ver env.py), así que en producción los 500 no se veían en ningún sitio. +# Con un handler de consola sin ese filtro, cualquier error queda en +# stdout/stderr, que es lo que recogen los logs del contenedor (`docker logs`, +# lo que agregue la plataforma de despliegue, etc.). +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'verbose': { + 'format': '{asctime} {levelname} {name} {message}', + 'style': '{', + }, + }, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + 'formatter': 'verbose', + }, + }, + # A WARNING fijo (no LOG_LEVEL): captura cualquier logger que no esté + # listado abajo (de terceros: weasyprint, whitenoise, PIL...) para que + # nada se pierda del todo, pero sin su parloteo en INFO/DEBUG -algunas + # librerías, como weasyprint, ya avisan cosas en INFO solo con + # importarlas-. 'django' y 'crochet' sí usan LOG_LEVEL, más abajo. + 'root': { + 'handlers': ['console'], + 'level': 'WARNING', + }, + 'loggers': { + 'django': { + 'handlers': ['console'], + 'level': LOG_LEVEL, + 'propagate': False, + }, + # Aquí es donde Django registra la traza completa de cualquier + # excepción no controlada en una vista (un 500): sin esto configurado + # explícitamente, en producción (DEBUG=False) solo se intentaba + # mandar por email a ADMINS, no configurado. + 'django.request': { + 'handlers': ['console'], + 'level': 'ERROR', + 'propagate': False, + }, + 'django.security': { + 'handlers': ['console'], + 'level': 'WARNING', + 'propagate': False, + }, + # Logger propio de la app, para poder hacer + # logging.getLogger(__name__) desde cualquier módulo de crochet/ sin + # tener que tocar esta configuración cada vez. + 'crochet': { + 'handlers': ['console'], + 'level': LOG_LEVEL, + 'propagate': False, + }, + }, +} diff --git a/config/settings/env.py b/config/settings/env.py index f667fea..28d0e28 100644 --- a/config/settings/env.py +++ b/config/settings/env.py @@ -43,3 +43,10 @@ EMAIL_HOST = env.str('EMAIL_HOST', '') EMAIL_HOST_USER = env.str('EMAIL_HOST_USER', '') EMAIL_HOST_PASSWORD = env.str('EMAIL_HOST_PASSWORD', '') EMAIL_PORT = env.int('EMAIL_PORT', 587) + +# Nivel de log de la app y de Django (ver LOGGING en base.py). En producción +# (DEBUG=False) Django, por defecto, solo manda los errores por email a +# ADMINS (que aquí no está configurado), así que sin un LOGGING propio no se +# ve ni un rastro de un 500 en ningún sitio; con esto van a stdout/stderr, +# que es lo que recogen los logs del contenedor. +LOG_LEVEL = env.str('LOG_LEVEL', 'INFO')