diff --git a/Logger/LokiLogger.py b/Logger/LokiLogger.py index a1e2885..fa3cd16 100644 --- a/Logger/LokiLogger.py +++ b/Logger/LokiLogger.py @@ -1,7 +1,9 @@ import time import json import requests -from typing import Optional, Dict, Any +import traceback +from typing import Optional, Dict, Any, Callable +from functools import wraps class LokiLogger: @@ -135,6 +137,17 @@ class LokiLogger: def error(self, message, labels=None, metadata=None): self.log("ERROR", message, labels, metadata) + def exception(self, exc: Exception, labels=None, metadata=None): + """ + Registra una excepción con traceback incluido. + Uso típico dentro de un bloque try/except. + """ + tb = traceback.format_exc() + message = str(exc) + metadata = metadata or {} + metadata["traceback"] = tb + self.log("ERROR", message, labels=labels, metadata=metadata) + def fatal(self, message, labels=None, metadata=None): self.log("FATAL", message, labels, metadata) @@ -143,3 +156,30 @@ class LokiLogger: def unknown(self, message, labels=None, metadata=None): self.log("UNKNOWN", message, labels, metadata) + + # 🧩 Nuevo decorador + def catch_exceptions(self, reraise: bool = False): + """ + Decorador que captura cualquier excepción dentro de la función, + la loguea con traceback, y opcionalmente la relanza. + + Ejemplo: + @logger.catch_exceptions() + def run_job(): + ... + """ + def decorator(func: Callable): + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + tb = traceback.format_exc() + self.error( + f"Exception en función '{func.__name__}': {e}", + metadata={"traceback": tb}, + ) + if reraise: + raise + return wrapper + return decorator