64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""Logging configuration for TH-Agenter."""
|
|
|
|
import logging
|
|
import logging.handlers
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
|
|
from .config import LoggingSettings
|
|
|
|
|
|
def setup_logging(logging_config: LoggingSettings) -> None:
|
|
"""Setup application logging."""
|
|
|
|
# 确保使用绝对路径,避免在不同目录运行时路径不一致
|
|
log_file_path = logging_config.file
|
|
if not Path(log_file_path).is_absolute():
|
|
# 如果是相对路径,则基于项目根目录计算绝对路径
|
|
# 项目根目录是backend的父目录
|
|
backend_dir = Path(__file__).parent.parent.parent
|
|
log_file_path = str(backend_dir / log_file_path)
|
|
|
|
# Create logs directory if it doesn't exist
|
|
log_file = Path(log_file_path)
|
|
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Configure root logger
|
|
root_logger = logging.getLogger()
|
|
root_logger.setLevel(getattr(logging, logging_config.level.upper()))
|
|
|
|
# Clear existing handlers
|
|
root_logger.handlers.clear()
|
|
|
|
# Create formatter
|
|
formatter = logging.Formatter(logging_config.format)
|
|
|
|
# Console handler
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(logging.INFO)
|
|
console_handler.setFormatter(formatter)
|
|
root_logger.addHandler(console_handler)
|
|
|
|
# File handler with rotation
|
|
file_handler = logging.handlers.RotatingFileHandler(
|
|
filename=log_file_path,
|
|
maxBytes=logging_config.max_bytes,
|
|
backupCount=logging_config.backup_count,
|
|
encoding="utf-8"
|
|
)
|
|
file_handler.setLevel(getattr(logging, logging_config.level.upper()))
|
|
file_handler.setFormatter(formatter)
|
|
root_logger.addHandler(file_handler)
|
|
|
|
# Set specific logger levels
|
|
logging.getLogger("uvicorn").setLevel(logging.INFO)
|
|
logging.getLogger("uvicorn.access").setLevel(logging.WARNING)
|
|
logging.getLogger("fastapi").setLevel(logging.INFO)
|
|
logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING)
|
|
|
|
logging.info("Logging configured successfully")
|
|
|
|
|
|
def get_logger(name: Optional[str] = None) -> logging.Logger:
|
|
"""Get a logger instance."""
|
|
return logging.getLogger(name or __name__) |