Files
home_stock/backend/app/core/logging.py
2026-01-28 19:22:30 +01:00

106 lines
3.0 KiB
Python

"""Configuration du système de logging avec Loguru.
Loguru est une bibliothèque de logging moderne et simple à utiliser.
Documentation : https://loguru.readthedocs.io/
"""
import sys
from pathlib import Path
from loguru import logger
from app.core.config import settings
# Supprimer les handlers par défaut de loguru
logger.remove()
def setup_logging() -> None:
"""Configure le système de logging pour l'application.
- En développement : logs dans stdout + fichier debug
- En production : logs dans fichiers avec rotation
"""
# Format de log avec couleurs pour stdout
log_format = (
"<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
"<level>{level: <8}</level> | "
"<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - "
"<level>{message}</level>"
)
# Format de log sans couleurs pour fichiers
log_format_file = (
"{time:YYYY-MM-DD HH:mm:ss.SSS} | "
"{level: <8} | "
"{name}:{function}:{line} - "
"{message}"
)
# === Configuration commune ===
# Handler pour stdout (console)
logger.add(
sys.stdout,
format=log_format,
level=settings.LOG_LEVEL,
colorize=True,
backtrace=True, # Affiche le traceback complet des exceptions
diagnose=settings.DEBUG, # Affiche les valeurs des variables en debug
)
# Créer le répertoire des logs s'il n'existe pas
log_dir = Path("logs")
log_dir.mkdir(exist_ok=True)
# === Configuration par environnement ===
if settings.is_development:
# En développement : logs détaillés dans un fichier
logger.add(
"logs/homestock_dev.log",
format=log_format_file,
level="DEBUG",
rotation="10 MB", # Rotation tous les 10 Mo
retention="7 days", # Garde les logs 7 jours
compression="zip", # Compression des logs archivés
backtrace=True,
diagnose=True,
)
else:
# En production : logs normaux + logs d'erreurs séparés
logger.add(
"logs/homestock.log",
format=log_format_file,
level="INFO",
rotation="50 MB",
retention="30 days",
compression="zip",
backtrace=True,
diagnose=False,
)
# Fichier séparé pour les erreurs
logger.add(
"logs/homestock_errors.log",
format=log_format_file,
level="ERROR",
rotation="50 MB",
retention="90 days", # Garde les erreurs plus longtemps
compression="zip",
backtrace=True,
diagnose=False,
)
logger.info(f"Logging configuré (level={settings.LOG_LEVEL}, env={settings.ENVIRONMENT})")
def get_logger(name: str) -> "logger":
"""Retourne un logger avec un nom spécifique.
Args:
name: Nom du logger (généralement __name__ du module)
Returns:
Logger configuré avec le nom spécifié
"""
return logger.bind(name=name)