import os import sys from loguru import logger as _logger __all__ = ["logger", "setup_logging"] logger = _logger _DEFAULT_FORMAT = ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | " "{level: <8} | " "{name}:{function}:{line} - " "{message}" ) def _as_bool(value: str | None) -> bool: """ Convert a string value to a boolean. Interprets `1/true/yes/on` (any case) as `True`; all other values or the absence of the variable are interpreted as `False`. """ if value is None: return False return value.strip().lower() in {"1", "true", "yes", "on"} def setup_logging( level: str | None = None, *, log_file: str | None = None, backtrace: bool | None = None, format_string: str | None = None, ) -> None: """ Configure the loguru logger for the console and, optionally, a file. Args: level: Logging level (`DEBUG/INFO/WARNING/ERROR`). If not specified, taken from `RWXF_LOG_LEVEL` or defaults to `INFO`. log_file: Path to the log file; if `None`, can be set via `RWXF_LOG_FILE`. backtrace: Enable detailed backtrace; by default read from `RWXF_LOG_BACKTRACE` (`1/true/yes/on` => `True`). format_string: Message format; defaults to `RWXF_LOG_FORMAT` or `_DEFAULT_FORMAT`. Environment variables for file output: - `RWXF_LOG_ROTATION` (e.g. `10 MB`) - `RWXF_LOG_RETENTION` (e.g. `7 days`) - `RWXF_LOG_COMPRESSION` (e.g. `gz`) """ configured_level = (level or os.getenv("RWXF_LOG_LEVEL") or "INFO").upper() configured_format = format_string or os.getenv("RWXF_LOG_FORMAT", _DEFAULT_FORMAT) configured_backtrace = backtrace if backtrace is not None else _as_bool(os.getenv("RWXF_LOG_BACKTRACE")) logger.remove() logger.add( sys.stderr, level=configured_level, format=configured_format, backtrace=configured_backtrace, diagnose=False, enqueue=True, ) destination = log_file or os.getenv("RWXF_LOG_FILE") if destination: logger.add( destination, level=configured_level, format=configured_format, backtrace=configured_backtrace, diagnose=False, enqueue=True, rotation=os.getenv("RWXF_LOG_ROTATION", "10 MB"), retention=os.getenv("RWXF_LOG_RETENTION", "7 days"), compression=os.getenv("RWXF_LOG_COMPRESSION", "gz"), )