logger.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. """Centralized logger configuration for the application.
  2. Configures the 'app' logger with a rotating file handler and console handler.
  3. Importing `logger` from this module gives a configured logger instance.
  4. """
  5. import logging
  6. import os
  7. from logging.handlers import RotatingFileHandler
  8. # Determine project base directory (app/..)
  9. base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
  10. log_dir = os.path.join(base_dir, "logs")
  11. os.makedirs(log_dir, exist_ok=True)
  12. log_file = os.path.join(log_dir, "app.log")
  13. logger = logging.getLogger("app")
  14. # Avoid reconfiguration if imported multiple times
  15. if not logger.handlers:
  16. formatter = logging.Formatter("%(asctime)s %(levelname)s %(name)s: %(message)s")
  17. # Resolve log level from environment (default INFO)
  18. log_level_name = os.getenv("LOG_LEVEL", "INFO").upper()
  19. try:
  20. log_level = getattr(logging, log_level_name)
  21. except Exception:
  22. log_level = logging.INFO
  23. # Rotating file handler
  24. file_handler = RotatingFileHandler(log_file, maxBytes=10 * 1024 * 1024, backupCount=7, encoding="utf-8")
  25. file_handler.setFormatter(formatter)
  26. file_handler.setLevel(log_level)
  27. logger.addHandler(file_handler)
  28. # Console handler
  29. console_handler = logging.StreamHandler()
  30. console_handler.setFormatter(formatter)
  31. console_handler.setLevel(log_level)
  32. logger.addHandler(console_handler)
  33. logger.setLevel(log_level)
  34. # Expose a helper to get child loggers if needed
  35. def get_logger(name: str = None):
  36. if name:
  37. return logging.getLogger(f"app.{name}")
  38. return logger