| from __future__ import annotations |
|
|
| import logging |
| import os |
| from logging.handlers import RotatingFileHandler |
| from pathlib import Path |
|
|
| _LOGGER_READY = False |
|
|
|
|
| def _configure_root_logger() -> None: |
| global _LOGGER_READY |
| if _LOGGER_READY: |
| return |
|
|
| log_path = Path(os.environ.get("LOG_FILE_PATH", "logs/app.log")) |
| log_path.parent.mkdir(parents=True, exist_ok=True) |
|
|
| root_logger = logging.getLogger("smart_career") |
| root_logger.setLevel(logging.INFO) |
|
|
| formatter = logging.Formatter( |
| fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", |
| datefmt="%Y-%m-%d %H:%M:%S", |
| ) |
|
|
| file_handler = RotatingFileHandler( |
| filename=log_path, |
| maxBytes=2 * 1024 * 1024, |
| backupCount=3, |
| encoding="utf-8", |
| ) |
| file_handler.setFormatter(formatter) |
|
|
| stream_handler = logging.StreamHandler() |
| stream_handler.setFormatter(formatter) |
|
|
| root_logger.addHandler(file_handler) |
| root_logger.addHandler(stream_handler) |
| _LOGGER_READY = True |
|
|
|
|
| def get_logger(name: str) -> logging.Logger: |
| _configure_root_logger() |
| return logging.getLogger(f"smart_career.{name}") |
|
|