169 lines
5.4 KiB
Python
169 lines
5.4 KiB
Python
#!/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()
|