| """ |
| Logging configuration with file rotation support. |
| """ |
|
|
| import logging |
| import sys |
| from logging.handlers import RotatingFileHandler |
| from pathlib import Path |
|
|
| from app.config import Config |
|
|
|
|
| def setup_logging(log_level: str = None) -> logging.Logger: |
| level = getattr(logging, (log_level or Config.LOG_LEVEL).upper(), logging.INFO) |
|
|
| logger = logging.getLogger('SuperTonic3') |
| logger.setLevel(level) |
|
|
| if logger.handlers: |
| return logger |
|
|
| console_handler = logging.StreamHandler(sys.stdout) |
| console_handler.setLevel(level) |
| console_format = logging.Formatter( |
| '%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' |
| ) |
| console_handler.setFormatter(console_format) |
| logger.addHandler(console_handler) |
|
|
| try: |
| log_dir = Path(Config.LOG_DIR) |
| log_dir.mkdir(parents=True, exist_ok=True) |
| log_path = log_dir / Config.LOG_FILE |
|
|
| file_handler = RotatingFileHandler( |
| log_path, |
| maxBytes=Config.LOG_MAX_BYTES, |
| backupCount=Config.LOG_BACKUP_COUNT, |
| encoding='utf-8', |
| ) |
| file_handler.setLevel(level) |
| file_format = logging.Formatter( |
| '%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s', |
| datefmt='%Y-%m-%d %H:%M:%S', |
| ) |
| file_handler.setFormatter(file_format) |
| logger.addHandler(file_handler) |
|
|
| except Exception as e: |
| logger.warning(f'Could not set up file logging: {e}') |
|
|
| logging.getLogger('werkzeug').setLevel(logging.WARNING) |
| logging.getLogger('urllib3').setLevel(logging.WARNING) |
|
|
| return logger |
|
|
|
|
| def get_logger(name: str = None) -> logging.Logger: |
| base_logger = logging.getLogger('SuperTonic3') |
| if name: |
| return base_logger.getChild(name) |
| return base_logger |
|
|