aef8791151
- Added Appshell component with responsive navbar and main content area - Integrated ColorSchemeToggle for light/dark mode switching - Created Welcome component with styled title and introductory text - Developed ChatPage for LLM interaction with WebSocket support - Implemented Biblioteca for managing notes with rich text editor - Added LoginPage for user authentication with error handling - Introduced MessageList and MessageBubble components for chat messages - Styled components with CSS modules for consistent design
63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
from loguru import logger
|
|
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP
|
|
from sqlalchemy.orm import sessionmaker
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
from domains.ArquitectureLayer.Model import Model_base
|
|
from domains.ConexionSql.Postgres_conexion import PostgresConexion
|
|
from domains.Credenciales.postgres_credencial import PostgresCredencial
|
|
|
|
class LoggerDB:
|
|
_sink_removido = False # ← evita múltiples remove() si se crean varias instancias
|
|
|
|
def __init__(self, credencial: PostgresCredencial, nombre_tabla: str, created_by: str = None):
|
|
|
|
# 🔥 Elimina todos los sinks activos, incluso los automáticos
|
|
logger.remove()
|
|
|
|
self.conexion = PostgresConexion(credencial)
|
|
self.engine = self.conexion.get_engine()
|
|
self.Session = sessionmaker(bind=self.engine)
|
|
self.nombre_tabla = nombre_tabla
|
|
self.created_by = created_by
|
|
|
|
self.modelo_logger = self._generar_modelo_logger()
|
|
self._crear_tabla_si_no_existe()
|
|
logger.add(self._sink, level="DEBUG")
|
|
|
|
def _generar_modelo_logger(self):
|
|
class LoggerTable(Model_base):
|
|
__tablename__ = self.nombre_tabla
|
|
__table_args__ = {'extend_existing': True} # 👈 Esta línea evita el error
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
nivel = Column(String, nullable=False)
|
|
mensaje = Column(Text, nullable=False)
|
|
fecha = Column(TIMESTAMP(timezone=True), nullable=False)
|
|
modulo = Column(String, nullable=True)
|
|
funcion = Column(String, nullable=True)
|
|
linea = Column(Integer, nullable=True)
|
|
return LoggerTable
|
|
|
|
def _crear_tabla_si_no_existe(self):
|
|
self.modelo_logger.__table__.create(self.engine, checkfirst=True)
|
|
|
|
def _sink(self, message):
|
|
record = message.record
|
|
try:
|
|
session = self.Session()
|
|
log_entry = self.modelo_logger(
|
|
nivel=record["level"].name,
|
|
mensaje=record["message"],
|
|
fecha=record["time"],
|
|
modulo=record["module"],
|
|
funcion=record["function"],
|
|
linea=record["line"],
|
|
sys_created_by=self.created_by
|
|
)
|
|
session.add(log_entry)
|
|
session.commit()
|
|
session.close()
|
|
except SQLAlchemyError as e:
|
|
print(f"[LoggerDB] Error guardando log en BD: {e}")
|