import logging import os from logging.handlers import RotatingFileHandler LOG_DIR = "./logs" def get_logger(name: str) -> logging.Logger: os.makedirs(LOG_DIR, exist_ok=True) logger = logging.getLogger(name) if logger.handlers: return logger logger.setLevel(logging.DEBUG) # Dosya handler — 5MB, max 3 dosya file_handler = RotatingFileHandler( os.path.join(LOG_DIR, f"{name}.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8" ) file_handler.setLevel(logging.DEBUG) file_fmt = logging.Formatter("%(asctime)s | %(levelname)-8s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S") file_handler.setFormatter(file_fmt) # Console handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_fmt = logging.Formatter("%(levelname)-8s | %(message)s") console_handler.setFormatter(console_fmt) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger def get_jsonl_logger(name: str) -> logging.Logger: """Returns a logger that writes raw JSON lines (no prefix) to logs/{name}.jsonl. Intended for machine-readable per-query traces.""" os.makedirs(LOG_DIR, exist_ok=True) logger = logging.getLogger(f"jsonl.{name}") if logger.handlers: return logger logger.setLevel(logging.INFO) logger.propagate = False # do not bubble up to root file_handler = RotatingFileHandler( os.path.join(LOG_DIR, f"{name}.jsonl"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8" ) file_handler.setLevel(logging.INFO) file_handler.setFormatter(logging.Formatter("%(message)s")) logger.addHandler(file_handler) return logger