#!/usr/bin/env python3 """ 日志轮转问题快速修复脚本 解决Windows系统上的文件锁定问题 """ import os import sys import time import shutil from pathlib import Path def fix_logging_issues(): """修复日志轮转问题""" print("=" * 60) print("🔧 KaMiXiTong 日志问题修复工具") print("=" * 60) logs_dir = Path('logs') log_file = logs_dir / 'kamaxitong.log' # 1. 确保日志目录存在 print("\n1. 检查日志目录...") if not logs_dir.exists(): logs_dir.mkdir(parents=True, exist_ok=True) print(" ✅ 已创建日志目录") else: print(" ✅ 日志目录已存在") # 2. 清理可能锁定的日志文件 print("\n2. 清理可能锁定的日志文件...") if log_file.exists(): try: # 尝试删除或重命名 backup_file = logs_dir / f'kamaxitong_{int(time.time())}.log' shutil.move(str(log_file), str(backup_file)) print(f" ✅ 已将原日志文件备份为: {backup_file.name}") except PermissionError as e: print(f" ⚠️ 无法移动日志文件: {str(e)}") print(" 💡 请手动关闭占用日志文件的进程") return False except Exception as e: print(f" ❌ 备份失败: {str(e)}") return False # 3. 清理旧的日志文件 print("\n3. 清理旧的日志文件...") old_logs = list(logs_dir.glob('*.log.*')) if old_logs: for old_log in old_logs: try: old_log.unlink() print(f" ✅ 已删除: {old_log.name}") except Exception as e: print(f" ⚠️ 无法删除 {old_log.name}: {str(e)}") else: print(" ✅ 没有旧的日志文件") # 4. 创建新的日志文件 print("\n4. 创建新的日志文件...") try: log_file.touch() print(f" ✅ 已创建新的日志文件: {log_file}") except Exception as e: print(f" ❌ 创建日志文件失败: {str(e)}") return False # 5. 检查文件权限 print("\n5. 检查文件权限...") try: # 测试写入权限 with open(log_file, 'a', encoding='utf-8') as f: f.write(f"# 日志文件创建时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n") print(" ✅ 文件写入权限正常") except PermissionError as e: print(f" ❌ 文件权限错误: {str(e)}") print(" 💡 请以管理员权限运行此脚本") return False # 6. 生成日志配置检查报告 print("\n" + "=" * 60) print("✅ 日志问题修复完成!") print("=" * 60) print("\n📋 修复摘要:") print(f" 日志目录: {logs_dir.absolute()}") print(f" 日志文件: {log_file.absolute()}") print(f" 文件大小: {log_file.stat().st_size} 字节") print(f" 创建时间: {time.strftime('%Y-%m-%d %H:%M:%S')}") print("\n🔍 下一步操作:") print(" 1. 重启 KaMiXiTong 应用") print(" 2. 检查日志是否正常写入: tail -f logs/kamaxitong.log") print(" 3. 监控日志轮转是否正常") print("\n💡 提示:") print(" - 如果仍有问题,请检查是否有其他进程占用日志文件") print(" - 在生产环境中,建议使用外部日志系统(如 ELK)") print(" - 可以通过设置 LOG_LEVEL=DEBUG 来获取更详细的日志") return True def check_windows_processes(): """检查可能占用日志文件的Windows进程""" print("\n" + "=" * 60) print("🔍 检查占用日志文件的进程") print("=" * 60) log_file = Path('logs/kamaxitong.log') if not log_file.exists(): print("❌ 日志文件不存在") return try: import psutil print(f"\n正在检查进程...") found_processes = [] for proc in psutil.process_iter(['pid', 'name', 'open_files']): try: # 检查进程打开的文件 if proc.info['open_files']: for file_path in proc.info['open_files']: if 'kamaxitong.log' in str(file_path): found_processes.append({ 'pid': proc.info['pid'], 'name': proc.info['name'], 'file': str(file_path) }) except (psutil.NoSuchProcess, psutil.AccessDenied): pass if found_processes: print("\n⚠️ 发现以下进程占用日志文件:") for proc in found_processes: print(f" PID: {proc['pid']}, 进程: {proc['name']}") print(f" 文件: {proc['file']}") else: print("\n✅ 没有发现占用日志文件的进程") except ImportError: print("\n⚠️ psutil 未安装,无法检查进程") print(" 安装命令: pip install psutil") def main(): """主函数""" # 修复日志问题 if not fix_logging_issues(): sys.exit(1) # 检查Windows进程(仅在Windows上) if os.name == 'nt': try: check_windows_processes() except Exception as e: print(f"\n⚠️ 进程检查失败: {str(e)}") print("\n" + "=" * 60) print("🎉 修复完成!") print("=" * 60) print("\n请重启应用以应用修复") if __name__ == '__main__': main()