83 lines
2.6 KiB
Dart
83 lines
2.6 KiB
Dart
import 'dart:io';
|
||
import 'package:path/path.dart' as p;
|
||
|
||
/// 文件日志工具类 - 用于诊断 UI 卡死问题
|
||
///
|
||
/// 将关键操作的时间戳写入 日志.log 文件,方便排查问题
|
||
/// 使用全局开关控制是否启用日志写入
|
||
class KRFileLogger {
|
||
static const String _logFileName = '日志.log';
|
||
|
||
/// 🔧 全局日志开关 - 修改为 true 可启用文件日志写入
|
||
static const bool _enableFileLogging = true; // ⚠️ 调试模式:开启日志分析UI阻塞 // ← 诊断完成后改回 false
|
||
|
||
static File? _logFile;
|
||
|
||
/// 初始化日志文件(应用启动时调用)
|
||
static Future<void> initialize() async {
|
||
if (!_enableFileLogging) return;
|
||
|
||
try {
|
||
// 获取应用根目录(Windows 下通常是 exe 所在目录)
|
||
final appDir = Directory.current;
|
||
final logPath = p.join(appDir.path, _logFileName);
|
||
_logFile = File(logPath);
|
||
|
||
// 如果日志文件已存在且大于 5MB,清空它
|
||
if (await _logFile!.exists()) {
|
||
final stat = await _logFile!.stat();
|
||
if (stat.size > 5 * 1024 * 1024) { // 5MB
|
||
await _logFile!.writeAsString('');
|
||
await _writeRaw('=== 日志文件已清空(超过 5MB)===\n');
|
||
}
|
||
}
|
||
|
||
await _writeRaw('=== 日志系统初始化 - ${DateTime.now().toIso8601String()} ===\n');
|
||
} catch (e) {
|
||
// 初始化失败,静默处理,不影响应用
|
||
}
|
||
}
|
||
|
||
/// 写入日志(带时间戳)
|
||
static Future<void> log(String message) async {
|
||
if (!_enableFileLogging || _logFile == null) return;
|
||
|
||
try {
|
||
final timestamp = DateTime.now().toIso8601String();
|
||
final logLine = '[$timestamp] $message\n';
|
||
await _logFile!.writeAsString(logLine, mode: FileMode.append);
|
||
} catch (e) {
|
||
// 日志写入失败,静默处理,不要破坏主流程
|
||
}
|
||
}
|
||
|
||
/// 直接写入原始内容(用于特殊格式)
|
||
static Future<void> _writeRaw(String content) async {
|
||
if (!_enableFileLogging || _logFile == null) return;
|
||
|
||
try {
|
||
await _logFile!.writeAsString(content, mode: FileMode.append);
|
||
} catch (e) {
|
||
// 日志写入失败,静默处理
|
||
}
|
||
}
|
||
|
||
/// 写入分隔线(用于区分不同的操作)
|
||
static Future<void> separator() async {
|
||
if (!_enableFileLogging) return;
|
||
await _writeRaw('\n---\n');
|
||
}
|
||
|
||
/// 清空日志文件
|
||
static Future<void> clear() async {
|
||
if (!_enableFileLogging || _logFile == null) return;
|
||
|
||
try {
|
||
await _logFile!.writeAsString('');
|
||
await _writeRaw('=== 日志已清空 - ${DateTime.now().toIso8601String()} ===\n');
|
||
} catch (e) {
|
||
// 清空失败,静默处理
|
||
}
|
||
}
|
||
}
|