import logging import os from datetime import datetime from logging.handlers import RotatingFileHandler from extensions import redis_client import json # 创建日志目录 LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'logs') os.makedirs(LOG_DIR, exist_ok=True) class SystemLogger: def __init__(self): self.logger = logging.getLogger('vision_ai') self.logger.setLevel(logging.INFO) # 文件处理器 (自动轮转,最大10MB,保留5个备份) file_handler = RotatingFileHandler( os.path.join(LOG_DIR, 'system.log'), maxBytes=10*1024*1024, backupCount=5, encoding='utf-8' ) file_handler.setLevel(logging.INFO) # 控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 格式化 formatter = logging.Formatter( '[%(asctime)s] %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) self.logger.addHandler(file_handler) self.logger.addHandler(console_handler) def _push_to_redis(self, level, message, extra=None): """同时推送到 Redis 用于前端实时查看""" try: log_entry = { "time": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "level": level, "message": message, "extra": extra or {} } # 保留最近 2000 条日志 redis_client.lpush('system_logs', json.dumps(log_entry, ensure_ascii=False)) redis_client.ltrim('system_logs', 0, 1999) except: pass def info(self, message, **kwargs): self.logger.info(message) self._push_to_redis('INFO', message, kwargs) def warning(self, message, **kwargs): self.logger.warning(message) self._push_to_redis('WARNING', message, kwargs) def error(self, message, **kwargs): self.logger.error(message) self._push_to_redis('ERROR', message, kwargs) def debug(self, message, **kwargs): self.logger.debug(message) self._push_to_redis('DEBUG', message, kwargs) # 全局日志实例 system_logger = SystemLogger()