增强日志
This commit is contained in:
220
main.py
220
main.py
@@ -167,7 +167,7 @@ def confirm_stress_test(duration: int, auto_confirm: bool = False) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def run_module(module_name: str, stress_test: bool = False, stress_duration: int = 300) -> Dict[str, Any]:
|
||||
def run_module(module_name: str, stress_test: bool = False, stress_duration: int = 300, progress_logger=None) -> Dict[str, Any]:
|
||||
"""
|
||||
运行指定的检测模块。
|
||||
|
||||
@@ -175,6 +175,7 @@ def run_module(module_name: str, stress_test: bool = False, stress_duration: int
|
||||
module_name: 模块名称
|
||||
stress_test: 是否执行压力测试
|
||||
stress_duration: 压力测试持续时间
|
||||
progress_logger: 进度日志记录器
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: 模块检测结果
|
||||
@@ -196,39 +197,89 @@ def run_module(module_name: str, stress_test: bool = False, stress_duration: int
|
||||
logger.error(f"未知模块: {module_name}")
|
||||
return {"status": "error", "error": f"未知模块: {module_name}"}
|
||||
|
||||
# 记录开始
|
||||
if progress_logger:
|
||||
progress_logger.start(f"模块检测: {module_name}")
|
||||
|
||||
try:
|
||||
logger.info(f"[MODULE START] {module_name} - stress_test={stress_test}, duration={stress_duration}")
|
||||
|
||||
module = __import__(module_map[module_name], fromlist=[''])
|
||||
|
||||
result = None
|
||||
if module_name == 'system':
|
||||
return module.get_system_info()
|
||||
if progress_logger:
|
||||
progress_logger.log("开始收集系统信息")
|
||||
result = module.get_system_info()
|
||||
elif module_name == 'cpu':
|
||||
return module.run_cpu_check(stress_test, stress_duration)
|
||||
if progress_logger:
|
||||
progress_logger.log(f"开始CPU检测 (stress_test={stress_test})")
|
||||
result = module.run_cpu_check(stress_test, stress_duration)
|
||||
elif module_name == 'memory':
|
||||
return module.run_memory_check(stress_test, stress_duration)
|
||||
if progress_logger:
|
||||
progress_logger.log(f"开始内存检测 (stress_test={stress_test})")
|
||||
result = module.run_memory_check(stress_test, stress_duration)
|
||||
elif module_name == 'storage':
|
||||
return module.run_storage_check()
|
||||
if progress_logger:
|
||||
progress_logger.log("开始存储设备检测")
|
||||
result = module.run_storage_check()
|
||||
elif module_name == 'sensors':
|
||||
return module.run_sensors_check()
|
||||
if progress_logger:
|
||||
progress_logger.log("开始传感器监控")
|
||||
result = module.run_sensors_check()
|
||||
elif module_name == 'gpu':
|
||||
return module.run_gpu_check()
|
||||
if progress_logger:
|
||||
progress_logger.log("开始显卡检测")
|
||||
result = module.run_gpu_check()
|
||||
elif module_name == 'logs':
|
||||
return module.analyze_logs()
|
||||
if progress_logger:
|
||||
progress_logger.log("开始日志分析")
|
||||
result = module.analyze_logs()
|
||||
|
||||
# 记录结果
|
||||
status = result.get("status", "unknown") if result else "unknown"
|
||||
logger.info(f"[MODULE END] {module_name} - Status: {status}")
|
||||
|
||||
# 如果结果中有错误信息,记录到日志
|
||||
if result and result.get("error"):
|
||||
logger.error(f"[MODULE ERROR] {module_name}: {result['error']}")
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.end(status=status)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"运行模块 {module_name} 时出错: {e}")
|
||||
error_msg = f"运行模块 {module_name} 时出错: {e}"
|
||||
logger.exception(error_msg)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.end(status="error", message=str(e))
|
||||
|
||||
return {"status": "error", "error": str(e)}
|
||||
|
||||
|
||||
def run_quick_check() -> Dict[str, Any]:
|
||||
def run_quick_check(progress_logger=None) -> Dict[str, Any]:
|
||||
"""
|
||||
执行快速检测(非侵入性)。
|
||||
|
||||
Args:
|
||||
progress_logger: 进度日志记录器
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: 检测结果
|
||||
"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 记录检测开始
|
||||
logger.info("=" * 70)
|
||||
logger.info("[DIAGNOSTIC START] 快速硬件检测")
|
||||
logger.info("=" * 70)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.start("快速硬件检测")
|
||||
|
||||
print("正在执行快速硬件检测...")
|
||||
print("-" * 60)
|
||||
|
||||
@@ -239,37 +290,54 @@ def run_quick_check() -> Dict[str, Any]:
|
||||
}
|
||||
|
||||
modules_to_run = ['system', 'cpu', 'memory', 'storage', 'sensors', 'gpu', 'logs']
|
||||
total_modules = len(modules_to_run)
|
||||
|
||||
for module_name in modules_to_run:
|
||||
for idx, module_name in enumerate(modules_to_run, 1):
|
||||
logger.info(f"[PROGRESS] 模块 {idx}/{total_modules}: {module_name}")
|
||||
print(f"正在检测: {module_name}...", end=' ', flush=True)
|
||||
|
||||
try:
|
||||
result = run_module(module_name, stress_test=False)
|
||||
result = run_module(module_name, stress_test=False, progress_logger=progress_logger)
|
||||
results["modules"][module_name] = result
|
||||
status = result.get("status", "unknown")
|
||||
|
||||
if status == "success":
|
||||
print("[完成]")
|
||||
logger.info(f"[MODULE SUCCESS] {module_name}")
|
||||
elif status == "warning":
|
||||
print("[警告]")
|
||||
logger.warning(f"[MODULE WARNING] {module_name}")
|
||||
elif status == "error":
|
||||
print("[错误]")
|
||||
logger.error(f"[MODULE ERROR] {module_name}: {result.get('error', 'Unknown error')}")
|
||||
else:
|
||||
print(f"[{status}]")
|
||||
logger.info(f"[MODULE {status.upper()}] {module_name}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"模块 {module_name} 执行失败: {e}")
|
||||
error_msg = f"模块 {module_name} 执行失败: {e}"
|
||||
logger.exception(error_msg)
|
||||
results["modules"][module_name] = {"status": "error", "error": str(e)}
|
||||
print("[失败]")
|
||||
|
||||
print("-" * 60)
|
||||
logger.info("[DIAGNOSTIC END] 快速硬件检测完成")
|
||||
logger.info("=" * 70)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.end(status="success")
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def run_full_diagnostic(stress_duration: int, auto_confirm: bool = False) -> Dict[str, Any]:
|
||||
def run_full_diagnostic(stress_duration: int, auto_confirm: bool = False, progress_logger=None) -> Dict[str, Any]:
|
||||
"""
|
||||
执行全面诊断(包含压力测试)。
|
||||
|
||||
Args:
|
||||
stress_duration: 压力测试持续时间
|
||||
auto_confirm: 是否自动确认
|
||||
progress_logger: 进度日志记录器
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: 检测结果
|
||||
@@ -281,6 +349,14 @@ def run_full_diagnostic(stress_duration: int, auto_confirm: bool = False) -> Dic
|
||||
print("诊断已取消")
|
||||
sys.exit(0)
|
||||
|
||||
# 记录诊断开始
|
||||
logger.info("=" * 70)
|
||||
logger.info(f"[DIAGNOSTIC START] 全面硬件诊断 (stress_duration={stress_duration}s)")
|
||||
logger.info("=" * 70)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.start("全面硬件诊断")
|
||||
|
||||
print("\n正在执行全面硬件诊断...")
|
||||
print("=" * 60)
|
||||
|
||||
@@ -293,38 +369,73 @@ def run_full_diagnostic(stress_duration: int, auto_confirm: bool = False) -> Dic
|
||||
|
||||
# 先执行快速检测
|
||||
modules_to_run = ['system', 'cpu', 'memory', 'storage', 'sensors', 'gpu', 'logs']
|
||||
total_modules = len(modules_to_run)
|
||||
|
||||
for module_name in modules_to_run:
|
||||
for idx, module_name in enumerate(modules_to_run, 1):
|
||||
logger.info(f"[PROGRESS] 模块 {idx}/{total_modules}: {module_name}")
|
||||
print(f"\n正在检测: {module_name}...")
|
||||
|
||||
try:
|
||||
# CPU 和内存执行压力测试
|
||||
do_stress = module_name in ['cpu', 'memory']
|
||||
result = run_module(module_name, stress_test=do_stress, stress_duration=stress_duration)
|
||||
|
||||
if do_stress:
|
||||
logger.warning(f"[STRESS TEST] {module_name} 压力测试即将开始 (duration={stress_duration}s)")
|
||||
print(f" ⚠ 即将执行 {module_name} 压力测试,持续时间 {stress_duration} 秒")
|
||||
|
||||
result = run_module(module_name, stress_test=do_stress, stress_duration=stress_duration, progress_logger=progress_logger)
|
||||
results["modules"][module_name] = result
|
||||
status = result.get("status", "unknown")
|
||||
|
||||
print(f" 状态: {status}")
|
||||
|
||||
if status == "success":
|
||||
logger.info(f"[MODULE SUCCESS] {module_name}")
|
||||
elif status == "warning":
|
||||
logger.warning(f"[MODULE WARNING] {module_name}")
|
||||
elif status == "error":
|
||||
logger.error(f"[MODULE ERROR] {module_name}: {result.get('error', 'Unknown error')}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"模块 {module_name} 执行失败: {e}")
|
||||
error_msg = f"模块 {module_name} 执行失败: {e}"
|
||||
logger.exception(error_msg)
|
||||
results["modules"][module_name] = {"status": "error", "error": str(e)}
|
||||
print(f" 状态: 失败 - {e}")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
logger.info("[DIAGNOSTIC END] 全面硬件诊断完成")
|
||||
logger.info("=" * 70)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.end(status="success")
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def run_specific_modules(module_list: str, stress_duration: int) -> Dict[str, Any]:
|
||||
def run_specific_modules(module_list: str, stress_duration: int, progress_logger=None) -> Dict[str, Any]:
|
||||
"""
|
||||
运行指定的模块列表。
|
||||
|
||||
Args:
|
||||
module_list: 逗号分隔的模块名称
|
||||
stress_duration: 压力测试持续时间
|
||||
progress_logger: 进度日志记录器
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: 检测结果
|
||||
"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
modules = [m.strip() for m in module_list.split(',')]
|
||||
|
||||
logger.info("=" * 70)
|
||||
logger.info(f"[DIAGNOSTIC START] 自定义模块检测: {', '.join(modules)}")
|
||||
logger.info("=" * 70)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.start(f"自定义模块检测: {', '.join(modules)}")
|
||||
|
||||
results = {
|
||||
"scan_type": "custom",
|
||||
"timestamp": get_file_timestamp(),
|
||||
@@ -334,18 +445,38 @@ def run_specific_modules(module_list: str, stress_duration: int) -> Dict[str, An
|
||||
print(f"正在执行自定义模块检测: {', '.join(modules)}")
|
||||
print("-" * 60)
|
||||
|
||||
for module_name in modules:
|
||||
total_modules = len(modules)
|
||||
|
||||
for idx, module_name in enumerate(modules, 1):
|
||||
logger.info(f"[PROGRESS] 模块 {idx}/{total_modules}: {module_name}")
|
||||
print(f"正在检测: {module_name}...", end=' ', flush=True)
|
||||
|
||||
try:
|
||||
result = run_module(module_name, stress_test=False)
|
||||
result = run_module(module_name, stress_test=False, progress_logger=progress_logger)
|
||||
results["modules"][module_name] = result
|
||||
status = result.get("status", "unknown")
|
||||
print(f"[{status}]")
|
||||
|
||||
if status == "error":
|
||||
logger.error(f"[MODULE ERROR] {module_name}: {result.get('error', 'Unknown error')}")
|
||||
elif status == "warning":
|
||||
logger.warning(f"[MODULE WARNING] {module_name}")
|
||||
else:
|
||||
logger.info(f"[MODULE SUCCESS] {module_name}")
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"模块 {module_name} 执行失败: {e}"
|
||||
logger.exception(error_msg)
|
||||
results["modules"][module_name] = {"status": "error", "error": str(e)}
|
||||
print(f"[失败: {e}]")
|
||||
|
||||
print("-" * 60)
|
||||
logger.info("[DIAGNOSTIC END] 自定义模块检测完成")
|
||||
logger.info("=" * 70)
|
||||
|
||||
if progress_logger:
|
||||
progress_logger.end(status="success")
|
||||
|
||||
return results
|
||||
|
||||
|
||||
@@ -362,6 +493,19 @@ def main():
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 创建进度日志记录器
|
||||
from utils import ProgressLogger
|
||||
progress_logger = ProgressLogger(log_file=args.log)
|
||||
|
||||
# 记录程序启动信息
|
||||
logger.info("=" * 70)
|
||||
logger.info("ServerGuard 启动")
|
||||
logger.info(f"命令行参数: {' '.join(sys.argv)}")
|
||||
logger.info(f"工作目录: {os.getcwd()}")
|
||||
logger.info(f"Python版本: {sys.version}")
|
||||
logger.info(f"用户ID: {os.getuid()}, 是否为root: {check_root_privileges()}")
|
||||
logger.info("=" * 70)
|
||||
|
||||
# 列出模块
|
||||
if args.list_modules:
|
||||
list_available_modules()
|
||||
@@ -375,21 +519,31 @@ def main():
|
||||
|
||||
# 执行诊断
|
||||
try:
|
||||
progress_logger.start("ServerGuard 诊断任务")
|
||||
|
||||
if args.quick:
|
||||
results = run_quick_check()
|
||||
logger.info("执行模式: 快速检测")
|
||||
results = run_quick_check(progress_logger=progress_logger)
|
||||
elif args.full:
|
||||
results = run_full_diagnostic(args.stress_duration, args.yes)
|
||||
logger.info("执行模式: 全面诊断")
|
||||
results = run_full_diagnostic(args.stress_duration, args.yes, progress_logger=progress_logger)
|
||||
elif args.module:
|
||||
results = run_specific_modules(args.module, args.stress_duration)
|
||||
logger.info(f"执行模式: 自定义模块 - {args.module}")
|
||||
results = run_specific_modules(args.module, args.stress_duration, progress_logger=progress_logger)
|
||||
else:
|
||||
print("请指定操作模式: --quick, --full, --module 或 --list-modules")
|
||||
sys.exit(1)
|
||||
|
||||
# 记录诊断完成
|
||||
progress_logger.end(status="success")
|
||||
logger.info("诊断执行完成,正在生成报告...")
|
||||
|
||||
# 生成报告
|
||||
generator = ReportGenerator()
|
||||
|
||||
if args.output:
|
||||
generator.save_report(results, args.format, args.output)
|
||||
logger.info(f"报告已保存至: {args.output}")
|
||||
print(f"\n报告已保存至: {args.output}")
|
||||
else:
|
||||
report = generator.generate_report(results, args.format)
|
||||
@@ -403,14 +557,32 @@ def main():
|
||||
m.get("status") == "error"
|
||||
for m in results.get("modules", {}).values()
|
||||
)
|
||||
|
||||
logger.info("=" * 70)
|
||||
logger.info(f"ServerGuard 正常结束 - 退出码: {1 if has_errors else 0}")
|
||||
logger.info("=" * 70)
|
||||
|
||||
sys.exit(1 if has_errors else 0)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logger.warning("操作已被用户中断 (KeyboardInterrupt)")
|
||||
print("\n\n操作已被用户中断")
|
||||
sys.exit(130)
|
||||
|
||||
except Exception as e:
|
||||
logger.exception("程序执行过程中发生错误")
|
||||
error_msg = f"程序执行过程中发生严重错误: {e}"
|
||||
logger.exception(error_msg)
|
||||
logger.error("=" * 70)
|
||||
logger.error(f"异常类型: {type(e).__name__}")
|
||||
logger.error(f"异常信息: {e}")
|
||||
logger.error("=" * 70)
|
||||
|
||||
# 尝试记录当前进度
|
||||
if progress_logger and progress_logger.current_step:
|
||||
logger.error(f"错误发生时正在执行的步骤: {progress_logger.current_step}")
|
||||
|
||||
print(f"\n错误: {e}")
|
||||
print(f"\n详细错误信息已记录到日志: {args.log}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user