75 lines
2.0 KiB
Python
75 lines
2.0 KiB
Python
# app/logger.py
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
from logging.handlers import RotatingFileHandler
|
|
from pathlib import Path
|
|
from typing import Optional, Union
|
|
|
|
|
|
def create_logger(
|
|
name: str = "factuges-sync",
|
|
*,
|
|
level: int = logging.INFO,
|
|
log_path: Optional[Union[str, Path]] = None,
|
|
max_bytes: int = 5_000_000, # rotación opcional
|
|
backup_count: int = 3,
|
|
) -> logging.Logger:
|
|
"""
|
|
Crea un logger consistente para FactuGES Sync.
|
|
|
|
Reglas:
|
|
- SIEMPRE envia logs a stdout (Docker-friendly).
|
|
- SOLO en producción escribe también a fichero si `log_path` está definido.
|
|
- `log_path` puede ser `str` o `Path`.
|
|
- Evita duplicar handlers.
|
|
"""
|
|
|
|
logger = logging.getLogger(name)
|
|
logger.setLevel(level)
|
|
|
|
# Si ya está configurado, no duplicamos handlers
|
|
if logger.handlers:
|
|
return logger
|
|
|
|
formatter = logging.Formatter(
|
|
"%(asctime)s - %(levelname)s - %(message)s"
|
|
)
|
|
|
|
# ------------------------------
|
|
# 1) Handler de consola (siempre)
|
|
# ------------------------------
|
|
h_console = logging.StreamHandler(sys.stdout)
|
|
h_console.setFormatter(formatter)
|
|
logger.addHandler(h_console)
|
|
|
|
# ------------------------------
|
|
# 2) Handler de fichero (solo prod)
|
|
# ------------------------------
|
|
environment = os.getenv("ENV", "development").lower()
|
|
|
|
if log_path and environment in ("production", "prod"):
|
|
p = Path(log_path)
|
|
|
|
# Aseguramos directorios
|
|
p.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Puedes usar FileHandler simple, pero Rotating es más seguro.
|
|
h_file = RotatingFileHandler(
|
|
filename=str(p),
|
|
maxBytes=max_bytes,
|
|
backupCount=backup_count,
|
|
encoding="utf-8",
|
|
)
|
|
h_file.setFormatter(formatter)
|
|
logger.addHandler(h_file)
|
|
|
|
return logger
|
|
|
|
|
|
# logger "global" ya creado
|
|
logger = create_logger()
|