Logger de aplicación¶
Todas las clases del framework heredan de LoggableMixin y escriben con self.log. Si
extiendes DKOps o escribes tus propias transformaciones, haz lo mismo en lugar de usar
print() o el módulo logging.
from DKOps.logger_config import LoggableMixin
class MiTransformacion(LoggableMixin):
def ejecutar(self, df):
self.log.info(f"Procesando {df.count():,} filas")
return df
self.log es un logger de Loguru asociado al nombre de la clase, así que cada línea ya
indica de dónde viene:
Helpers semánticos¶
Además de info, debug, warning y error, el mixin incluye métodos que producen un
formato uniforme. Es preferible usarlos a componer el mensaje a mano.
| Helper | Cuándo usarlo |
|---|---|
log_start(op, **ctx) |
Al empezar una operación |
log_end(op, elapsed_s, **ctx) |
Al terminar, con la duración si la tienes |
log_read_ok(op, rows, source) |
Después de una lectura correcta |
log_write_ok(op, rows, target, mode) |
Después de una escritura correcta |
log_transform_ok(op, ...) |
Tras una transformación, con filas de entrada y salida |
log_skip(op, reason) |
Cuando se omite algo a propósito |
log_warning(op, message, **ctx) |
Para una advertencia dentro de una operación |
log_error(op, exc, **ctx) |
Para un error, con la traza completa |
class LectorVentas(LoggableMixin):
def leer(self, path):
self.log_start("lectura", source=path)
df = self._spark.read.parquet(path)
self.log_read_ok("lectura", rows=df.count(), source=path)
return df
El decorador log_operation¶
Si lo único que necesitas es marcar el inicio, el fin, la duración y los errores de un método, el decorador lo hace por ti:
from DKOps.logger_config import LoggableMixin, log_operation
class Pipeline(LoggableMixin):
@log_operation("normalización de fechas")
def normalizar(self, df):
return df.withColumn(...)
@log_operation(log_args=True) # incluye los argumentos en el log
def run(self, table: str, date: str):
...
Genera una línea de inicio y otra de fin con el tiempo medido. Si el método lanza una excepción, la registra con su traza. Funciona también en clases que no heredan del mixin.
Configuración¶
No hay que inicializar nada: Launcher llama a AppLogger.setup() y añade el handler de
archivo. Los valores se leen de config.json:
{
"LOG_LEVEL": "INFO",
"LOG_DIR": "/tmp/logs",
"LOG_ROTATION": "10 MB",
"LOG_RETENTION": "7 days",
"LOG_SERIALIZE": false
}
| Clave | Descripción |
|---|---|
LOG_LEVEL |
Nivel mínimo: DEBUG, INFO, WARNING o ERROR |
LOG_DIR |
Carpeta de los archivos de log. Puede ser una ruta cloud, ver Logs en la nube |
LOG_ROTATION |
Tamaño o periodo a partir del cual se rota el archivo |
LOG_RETENTION |
Cuánto tiempo se conservan los archivos rotados |
LOG_SERIALIZE |
Con true, cada línea se emite como JSON. Útil para herramientas de observabilidad |
Usa DEBUG cuando una escritura no hace lo esperado
Los writers registran en nivel DEBUG el SQL que ejecutan: el MERGE INTO completo,
el DDL y las sentencias de comentarios. Es lo primero que conviene revisar.