ソースを参照

Añado nuevo logging

Celestino Rey 10 ヶ月 前
親
コミット
b45ba3eca5

+ 8 - 9
src/finanzas/views.py

@@ -29,8 +29,7 @@ from .recurrentes import procesar_transacciones_recurrentes
 
 import logging
 
-logger_info = logging.getLogger('finanzas')
-logger_debug = logging.getLogger('django')
+logger = logging.getLogger(__name__)
 
 @login_required
 def dashboard(request):
@@ -47,13 +46,13 @@ def dashboard(request):
         mes = int(form_fecha.cleaned_data['mes'])
         anio = int(form_fecha.cleaned_data['anio'])
 
-    # logger.warning(f"dashboard: mes: {mes} / año: {anio}")
+    logger.info(f"dashboard: mes: {mes} / año: {anio}")
 
     inicio_mes = timezone.make_aware(datetime(anio, mes, 1))
     ultimo_dia = monthrange(anio, mes)[1]
     fin_mes = timezone.make_aware(datetime(anio, mes, ultimo_dia, 23, 59, 59))
 
-    logger_debug.debug("Inicio mes %s. Último día: %s. Fin_mes: %s", inicio_mes,ultimo_dia,fin_mes)
+    logger.debug("Inicio mes %s. Último día: %s. Fin_mes: %s", inicio_mes,ultimo_dia,fin_mes)
 
     movimientos = Movimiento.objects.filter(usuario=request.user, fecha__range=(inicio_mes, fin_mes)).order_by('-fecha')
 
@@ -61,8 +60,8 @@ def dashboard(request):
 
     frecuentes = MovimientoFrecuente.objects.filter(usuario=request.user).order_by('cuenta_destino')
     
-    logger_info.debug("Rendering dashboard view with %d movimientos and %d favoritas", movimientos.count(), favoritas.count())   
-    logger_info.info("User %s accessed principal view", request.user.nombre if request.user.is_authenticated else "Anonymous") 
+    logger.debug("Rendering dashboard view with %d movimientos and %d favoritas", movimientos.count(), favoritas.count())   
+    logger.info("User %s accessed principal view", request.user.nombre if request.user.is_authenticated else "Anonymous") 
 
     form_filtro = FiltroForm(request.GET or None)
 
@@ -170,7 +169,7 @@ def agregar_movimiento(request):
                     datos_iniciales['monto'] = str(Decimal(monto_normalizado).quantize(Decimal('0.01')))
                 except InvalidOperation:
                     pass  # Ignorar monto malformado
-                    logger_info.warning(f"monto: mal formado {datos_iniciales['monto']}")
+                    logger.warning(f"monto: mal formado {datos_iniciales['monto']}")
         except (Cuenta.DoesNotExist, InvalidOperation):
             pass
 
@@ -398,7 +397,7 @@ def api_ejecutar_recurrentes(request):
 
     # Usar token dedicado para la API de informes
     if token_enviado != settings.RECURRENTES_API_TOKEN:
-        logger_info.warning('api_ejecutar_recurrentes: intento no autorizado %s', token_enviado, extra={'ip': request.META.get('REMOTE_ADDR'), 'cuenta_id': request.GET.get('cuenta_id')})
+        logger.warning('api_ejecutar_recurrentes: intento no autorizado %s', token_enviado, extra={'ip': request.META.get('REMOTE_ADDR'), 'cuenta_id': request.GET.get('cuenta_id')})
         return JsonResponse({'error': 'No autorizado'}, status=403)
 
     procesar_transacciones_recurrentes(hoy=now().date())
@@ -453,7 +452,7 @@ def informe_cuenta(request):
 
     cuenta = get_object_or_404(Cuenta, id=cuenta_id, usuario=request.user)
 
-    logger_info.info('api_informe_cuenta: petición aceptada: %s', cuenta_id)
+    logger.info('api_informe_cuenta: petición aceptada: %s', cuenta_id)
 
     form = FiltroInformeCuentaForm(request.GET or None)
 

+ 60 - 0
src/misfinanzas/logging.py

@@ -0,0 +1,60 @@
+from pathlib import Path
+# Base directory of the project
+BASE_DIR = Path(__file__).resolve().parent.parent
+
+# https://www.youtube.com/watch?v=9DbOLRE6me0
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'filters': {
+        'require_debug_false': {
+            '()': 'django.utils.log.RequireDebugFalse',
+        },
+    },
+    'formatters': {
+        'simple': {
+            'format': '{levelname} {asctime:s} {name} {message}',
+            'style': '{',
+        },
+        'verbose': {
+            'format': '{levelname} {asctime:s} {module} {process:d} {thread:d} {message}',
+            'style': '{',
+        }
+    },
+    'handlers': {
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'simple',
+        },
+        'file': {
+            'level': 'DEBUG',
+            'class': 'logging.FileHandler',
+            'filename': BASE_DIR / 'app.log',
+            'formatter': 'verbose',
+        },
+        'mail_admins': {
+            'level': 'ERROR',
+            'class': 'django.utils.log.AdminEmailHandler',
+            'filters': ['require_debug_false'],
+            'formatter': 'verbose',
+        },
+    },
+    'loggers': {
+        "": {
+            "level": "WARNING",
+            "handlers": ["console", "file", "mail_admins"],
+        },
+        "django": {
+            "level": "INFO",
+            "handlers": ["console"],
+            "propagate": False,
+        },
+        "django.template": {
+            "level": "DEBUG",
+            "handlers": ["file"],
+            "propagate": False,
+        },
+    },
+}

+ 3 - 2
src/misfinanzas/settings.py

@@ -12,7 +12,7 @@ https://docs.djangoproject.com/en/5.2/ref/settings/
 
 import os
 from pathlib import Path
-import logging
+from .logging import LOGGING
 
 APP_NAME = "Finanzas"
 APP_VERSION = os.environ.get("APP_VERSION", "17.0.10")  # Valor por defecto si no está definido
@@ -165,7 +165,7 @@ RECURRENTES_API_TOKEN = 'mi-token-secreto-superseguro'
 # Token dedicado para la API de generación de informes PDF
 # REPORTS_API_TOKEN = os.environ.get('REPORTS_API_TOKEN', 'mi-token-informes-por-defecto')
 
-
+'''
 LOGGING = {
     'version': 1,
     'disable_existing_loggers': False,
@@ -212,3 +212,4 @@ LOGGING = {
         },
     },
 }
+'''

+ 1 - 0
src/misfinanzas/urls.py

@@ -32,5 +32,6 @@ urlpatterns = [
     path('usuarios/', include("reymotausers.urls")),
 
     path("acerca-de/", views.acerca_de, name="acerca_de"),
+    path('ver-fichero-log/<str:fichero>/', ver_fichero_log, name='ver_fichero_log'),
 
 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 15 - 0
src/misfinanzas/views.py

@@ -4,6 +4,10 @@ from django.contrib.auth.decorators import user_passes_test
 from django.shortcuts import render
 from django.http import HttpResponseForbidden
 
+from django.http import HttpResponse
+from django.http import Http404
+
+from django.contrib.auth.decorators import user_passes_test
 
 @user_passes_test(lambda u: u.is_staff)
 def ver_variables_entorno(request):
@@ -38,3 +42,14 @@ def acerca_de(request):
         "img_version": settings.IMG_VERSION
     }
     return render(request, "acerca_de.html", context)
+
+@user_passes_test(lambda u: u.is_staff)
+def ver_fichero_log(request, fichero):
+    ruta_fichero = settings.BASE_DIR / fichero
+    
+    if ruta_fichero.exists():
+        with open(ruta_fichero, 'r') as f:
+            response = HttpResponse(f.read(), content_type='text/plain')
+            return response
+    else:
+        return Http404("Fichero no encontrado")