| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- """Centralized logger configuration for the application.
- Configures the 'app' logger with a rotating file handler and console handler.
- Importing `logger` from this module gives a configured logger instance.
- """
- import logging
- import os
- from logging.handlers import RotatingFileHandler
- # Determine project base directory (app/..)
- base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
- log_dir = os.path.join(base_dir, "logs")
- os.makedirs(log_dir, exist_ok=True)
- log_file = os.path.join(log_dir, "app.log")
- logger = logging.getLogger("app")
- # Avoid reconfiguration if imported multiple times
- if not logger.handlers:
- formatter = logging.Formatter("%(asctime)s %(levelname)s %(name)s: %(message)s")
- # Resolve log level from environment (default INFO)
- log_level_name = os.getenv("LOG_LEVEL", "INFO").upper()
- try:
- log_level = getattr(logging, log_level_name)
- except Exception:
- log_level = logging.INFO
- # Rotating file handler
- file_handler = RotatingFileHandler(log_file, maxBytes=10 * 1024 * 1024, backupCount=7, encoding="utf-8")
- file_handler.setFormatter(formatter)
- file_handler.setLevel(log_level)
- logger.addHandler(file_handler)
- # Console handler
- console_handler = logging.StreamHandler()
- console_handler.setFormatter(formatter)
- console_handler.setLevel(log_level)
- logger.addHandler(console_handler)
- logger.setLevel(log_level)
- # Expose a helper to get child loggers if needed
- def get_logger(name: str = None):
- if name:
- return logging.getLogger(f"app.{name}")
- return logger
|