from flask import Blueprint, render_template, jsonify, request, send_from_directory, current_app from .auth import login_required import logging import os import time from datetime import datetime import platform import psutil from collections import deque # 创建系统信息蓝图 system_bp = Blueprint('system', __name__) logger = logging.getLogger("SystemBlueprint") # 页面路由 @system_bp.route('/wx_logs') @login_required def wx_logs(): return render_template('wx_logs.html') # API路由 @system_bp.route('/api/system_info') @login_required def api_system_info(): try: # 获取系统信息 system_info = { "os": platform.system(), "os_version": platform.version(), "python_version": platform.python_version(), "cpu_usage": psutil.cpu_percent(), "memory_usage": psutil.virtual_memory().percent, "disk_usage": psutil.disk_usage('/').percent, "uptime": time.time() - psutil.boot_time(), "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") } return jsonify({"success": True, "data": system_info}) except Exception as e: logger.error(f"获取系统信息失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @system_bp.route('/api/wx_logs') @login_required def api_wx_logs(): try: log_type = request.args.get('type', 'info') # 默认显示info日志 lines = request.args.get('lines', 100, type=int) # 默认显示最后100行 # 修正日志文件路径计算,获取项目根目录 # 从当前文件位置向上导航3层到项目根目录 # blueprints -> dashboard -> admin -> WeChatRobot project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..')) if log_type == 'error': log_file = os.path.join(project_root, 'wx_error.log') else: log_file = os.path.join(project_root, 'wx_info.log') # logger.info(f"尝试读取日志文件: {log_file}") # 读取日志文件 log_content = [] if os.path.exists(log_file): with open(log_file, 'r', encoding='utf-8', errors='ignore') as f: # 使用deque获取最后N行 log_content = list(deque(f, lines)) else: logger.warning(f"日志文件不存在: {log_file}") # 尝试列出项目根目录下的所有日志文件,帮助调试 try: all_files = [f for f in os.listdir(project_root) if f.endswith('.log')] logger.info(f"项目根目录下的日志文件: {all_files}") except Exception as e: logger.error(f"列出目录文件失败: {e}") return jsonify({ "success": True, "data": { "log_type": log_type, "log_file": log_file, "content": log_content, "lines": len(log_content) } }) except Exception as e: logger.error(f"获取微信日志失败: {e}") return jsonify({"success": False, "error": str(e)}), 500