Agregar logging estructurado, try-catches y envío de errores por Telegram

- Agregado logging estructurado en todos los módulos
- Implementados try-catches en todos los métodos críticos
- Errores ahora se envían automáticamente por Telegram
- Mejorado manejo de excepciones en requests HTTP
- Agregado try-catch global en main.py para errores no manejados
- Logging detallado en timenet_manager, telegram_bot, google_calendar y config_parser
This commit is contained in:
Omar Sánchez Pizarro
2026-01-13 01:39:16 +01:00
parent c052439de3
commit ce179ebff9
5 changed files with 712 additions and 219 deletions

View File

@@ -1,8 +1,11 @@
import json, os
import logging
from app import arg_parser
args = arg_parser.ArgParser().parse()
logger = logging.getLogger(__name__)
class ConfigParser:
config = None
@@ -11,22 +14,71 @@ class ConfigParser:
self.loadConfig()
def loadConfig(self):
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(ROOT_DIR, '../config.json')
try:
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(ROOT_DIR, '../config.json')
logger.info(f"Ruta base del config: {path}")
if args.config:
path = args.config
if args.config:
path = args.config
logger.info(f"Usando ruta de config personalizada: {path}")
with open(path, 'r') as f:
self.config = json.load(f)
if not os.path.exists(path):
error_msg = f"Archivo de configuración no encontrado: {path}"
logger.error(error_msg)
raise FileNotFoundError(error_msg)
if args.geoLatitude:
self.config['geo']['latitude'] = args.geoLatitude
if args.geoLongitude:
self.config['geo']['longitude'] = args.geoLongitude
if args.user:
self.config['user'] = args.user
if args.geoAccuracy:
self.config['geo']['accuracy'] = args.geoAccuracy
logger.info(f"Cargando configuración desde: {path}")
with open(path, 'r', encoding='utf-8') as f:
try:
self.config = json.load(f)
logger.info("Configuración cargada correctamente")
except json.JSONDecodeError as e:
error_msg = f"Error al parsear JSON del archivo de configuración: {str(e)}"
logger.error(error_msg, exc_info=True)
raise ValueError(error_msg)
return self.config
# Validar estructura básica
if not isinstance(self.config, dict):
error_msg = "El archivo de configuración no contiene un objeto JSON válido"
logger.error(error_msg)
raise ValueError(error_msg)
# Aplicar overrides de argumentos
try:
if args.geoLatitude:
if 'geo' not in self.config:
self.config['geo'] = {}
self.config['geo']['latitude'] = args.geoLatitude
logger.info(f"Latitud sobrescrita por argumento: {args.geoLatitude}")
if args.geoLongitude:
if 'geo' not in self.config:
self.config['geo'] = {}
self.config['geo']['longitude'] = args.geoLongitude
logger.info(f"Longitud sobrescrita por argumento: {args.geoLongitude}")
if args.user:
self.config['user'] = args.user
logger.info(f"Usuario sobrescrito por argumento: {args.user}")
if args.geoAccuracy:
if 'geo' not in self.config:
self.config['geo'] = {}
self.config['geo']['accuracy'] = args.geoAccuracy
logger.info(f"Precisión geográfica sobrescrita por argumento: {args.geoAccuracy}")
except Exception as e:
logger.warning(f"Error al aplicar overrides de argumentos: {str(e)}")
logger.info("Configuración procesada correctamente")
return self.config
except FileNotFoundError as e:
logger.error(f"Archivo de configuración no encontrado: {str(e)}", exc_info=True)
raise
except json.JSONDecodeError as e:
logger.error(f"Error de sintaxis JSON en configuración: {str(e)}", exc_info=True)
raise
except Exception as e:
error_msg = f"Error inesperado al cargar configuración: {str(e)}"
logger.error(error_msg, exc_info=True)
raise