"""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 = ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | " "{level: <8} | " "{name}:{function}:{line} - " "{message}" ) # 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)