Files
abot/admin/dashboard/blueprints/system.py
2025-04-03 13:37:15 +08:00

89 lines
3.1 KiB
Python

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