"""Logging configuration using Loguru.- File sink: captures ALL logs (DEBUG+) to ``logs/YYYY-MM-DD.log``- Console sink: level is configurable per process (default INFO)"""importloggingimportsysfromdatetimeimportdatetimefrompathlibimportPathfromloguruimportloggeras_loguru_logger_CONFIGURED:bool=Falsedef_configure_loguru(console_level:int=logging.INFO)->None:"""Configure Loguru sinks once per process. :param console_level: Console log level (e.g., ``logging.INFO``). :returns: ``None``. """global_CONFIGUREDif_CONFIGURED:returnlogs_dir=Path("logs")logs_dir.mkdir(exist_ok=True)log_filename=f"{datetime.now().strftime('%Y-%m-%d')}.log"log_filepath=logs_dir/log_filename# Remove default sink to avoid duplicate outputstry:_loguru_logger.remove()exceptException:pass# Console sink (level configurable)_loguru_logger.add(sys.stdout,level=console_level,format="{time:YYYY-MM-DD HH:mm:ss} - {name} - {level} - {message}",enqueue=True,diagnose=False,backtrace=False,)# File sink (always DEBUG and above)_loguru_logger.add(str(log_filepath),level="DEBUG",format="{time:YYYY-MM-DD HH:mm:ss} - {name} - {level} - {message}",rotation="00:00",encoding="utf-8",enqueue=True,diagnose=False,backtrace=False,)_CONFIGURED=True
[docs]defsetup_logger(name:str,log_level:int=logging.INFO):"""Return a Loguru logger bound for module usage. Note: ``name`` is not required by Loguru to display the module name; the format uses ``{name}`` from the call site. We keep the signature for backward compatibility. :param name: Logger name (unused by Loguru, retained for API stability). :param log_level: Console log level. :returns: Configured Loguru logger. """_configure_loguru(console_level=log_level)return_loguru_logger
[docs]defget_logger(name:str):"""Get configured Loguru logger. :param name: Logger name (unused by Loguru, retained for API stability). :returns: Configured Loguru logger. """returnsetup_logger(name)