""" 日誌系統設定模組 """ import logging import sys from pathlib import Path from app.core.config import settings class SensitiveFilter(logging.Filter): """過濾敏感資訊的日誌過濾器""" def filter(self, record): """過濾包含敏感資訊的日誌訊息""" sensitive_keywords = ['password', 'secret', 'key', 'token', 'api_key', 'db_password'] msg = str(record.getMessage()).lower() for keyword in sensitive_keywords: if keyword in msg: # 只記錄錯誤類型,不記錄詳細內容 record.msg = f"[敏感資訊已過濾] {record.name}" record.args = () break return True def setup_logging(): """設定日誌系統""" # 建立 logs 目錄 log_dir = Path("logs") log_dir.mkdir(exist_ok=True) # 設定日誌等級 log_level = logging.DEBUG if settings.debug else logging.INFO # 設定日誌格式 log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' date_format = '%Y-%m-%d %H:%M:%S' # 設定處理器 handlers = [ logging.StreamHandler(sys.stdout), logging.FileHandler('logs/app.log', encoding='utf-8') ] # 如果是生產環境,也記錄錯誤到單獨的檔案 if settings.app_env == "production": error_handler = logging.FileHandler('logs/error.log', encoding='utf-8') error_handler.setLevel(logging.ERROR) handlers.append(error_handler) # 設定基本配置 logging.basicConfig( level=log_level, format=log_format, datefmt=date_format, handlers=handlers ) # 應用敏感資訊過濾器 sensitive_filter = SensitiveFilter() for handler in logging.root.handlers: handler.addFilter(sensitive_filter) # 設定第三方庫的日誌等級 logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) return logging.getLogger(__name__) # 初始化日誌系統 logger = setup_logging()