Explorar el Código

logger enhance

tanlie hace 6 días
padre
commit
1163b37a0b
Se han modificado 2 ficheros con 73 adiciones y 9 borrados
  1. 25 0
      .github/workflows/ci.yml
  2. 48 9
      app/utils/logger.py

+ 25 - 0
.github/workflows/ci.yml

@@ -0,0 +1,25 @@
+name: CI
+
+on:
+  push:
+    branches: [ main, master ]
+  pull_request:
+    branches: [ main, master ]
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v4
+      - name: Set up Python
+        uses: actions/setup-python@v4
+        with:
+          python-version: '3.11'
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install -r requirements.txt
+      - name: Run tests
+        run: |
+          pytest -q

+ 48 - 9
app/utils/logger.py

@@ -1,11 +1,56 @@
 import logging
 from logging.config import dictConfig
+import os
+from logging.handlers import RotatingFileHandler, HTTPHandler
 
 
 def setup_logging(app):
-    """Configure basic logging for the application."""
+    """Configure logging: console, optional file and external HTTP handler.
+
+    Controlled by env vars:
+    - LOG_FILE: path to write rotating logs
+    - LOG_MAX_BYTES: max bytes per file (default 10MB)
+    - LOG_BACKUP_COUNT: number of backups (default 5)
+    - EXTERNAL_LOG_URL: if set, an HTTPHandler will POST logs to this URL
+    """
     level = logging.DEBUG if app.config.get("DEBUG") else logging.INFO
 
+    handlers = {
+        "console": {
+            "class": "logging.StreamHandler",
+            "formatter": "default",
+            "level": level,
+        }
+    }
+
+    root_handlers = ["console"]
+
+    log_file = os.getenv("LOG_FILE")
+    if log_file:
+        # ensure parent dirs exist
+        os.makedirs(os.path.dirname(log_file), exist_ok=True)
+        handlers["file"] = {
+            "class": "logging.handlers.RotatingFileHandler",
+            "formatter": "default",
+            "level": level,
+            "filename": log_file,
+            "maxBytes": int(os.getenv("LOG_MAX_BYTES", 10 * 1024 * 1024)),
+            "backupCount": int(os.getenv("LOG_BACKUP_COUNT", 5)),
+        }
+        root_handlers.append("file")
+
+    external = os.getenv("EXTERNAL_LOG_URL")
+    if external:
+        handlers["external"] = {
+            "class": "logging.handlers.HTTPHandler",
+            "formatter": "default",
+            "level": level,
+            "host": external,
+            "url": "/",
+            "method": "POST",
+        }
+        root_handlers.append("external")
+
     config = {
         "version": 1,
         "disable_existing_loggers": False,
@@ -14,15 +59,9 @@ def setup_logging(app):
                 "format": "%(asctime)s %(levelname)s %(name)s: %(message)s",
             }
         },
-        "handlers": {
-            "console": {
-                "class": "logging.StreamHandler",
-                "formatter": "default",
-                "level": level,
-            }
-        },
+        "handlers": handlers,
         "root": {
-            "handlers": ["console"],
+            "handlers": root_handlers,
             "level": level,
         },
     }