用户实测两个问题(先装好驱动的机器): 1. 双击 App 图标不一定能打开——根因 single_instance:唤醒端口 38210 被 残留占用(上次异常退出/TIME_WAIT)时,connect 无应答仍返回 false → main 直接 exit(0)。修复:端口被占但无应答判定为残留占用,照常启动 (仅唤醒功能降级,FileLog 留痕);有应答才作为第二实例退出。 2. 向导第三步点"完成"没反应——根因 _finish 只有 finally 没有 catch: Autostart/UrlScheme(reg 三连)/FirstRun 任一抛异常被静默吞,Navigator.pop 永不执行=对话框锁死。修复:每步独立 try-catch + 分步日志,成败都关闭 向导,失败汇总 SnackBar 提示"详见运行日志"。 本地日志文件系统(用户要求:仔细记录、可发回分析、定时删除): - lib/utils/file_log.dart:按天滚动 app-YYYYMMDD.log、单文件 5MB 轮转加 序号、启动清理 7 天前旧文件(按文件名日期判定);全同步追加写(低频 日志,保证异常退出前落盘);目录 mac ~/Library/Logs/zax-desktop-plugin/ win %APPDATA%\zax-desktop-plugin\logs\(不引第三方依赖) - AgentLog.write 挂文件输出(一处改动覆盖全部 22 个现有调用点); main.dart FileLog.init 提到最前,bootWarning/startError 全部落日志, 启动横幅记录平台/exe 路径/参数 - pavo isolate 的 [pavo-diag] 诊断日志传日志路径(纯数据,isolate 安全) 直接写文件——GUI 模式下 isolate stdout 本来就丢 - 插件页技术详情加"打开日志文件夹"按钮(Explorer/Finder 直达,用户打包 app-*.log 发回分析) 19 个测试全过、analyze 零问题。
48 lines
1.5 KiB
Dart
48 lines
1.5 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:desktop_plugin/utils/file_log.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
late Directory tmp;
|
|
|
|
setUp(() {
|
|
tmp = Directory.systemTemp.createTempSync('filelog-test');
|
|
FileLog.init(tmp.path);
|
|
});
|
|
|
|
tearDown(() {
|
|
FileLog.dispose();
|
|
try {
|
|
tmp.deleteSync(recursive: true);
|
|
} catch (_) {}
|
|
});
|
|
|
|
test('写入按天命名的日志文件,行带完整时间戳', () {
|
|
FileLog.write('hello 世界');
|
|
FileLog.write('second line');
|
|
final path = FileLog.currentPath!;
|
|
expect(path, contains('app-'));
|
|
expect(path, endsWith('.log'));
|
|
final text = File(path).readAsStringSync();
|
|
expect(text, contains('hello 世界'));
|
|
expect(text, contains('second line'));
|
|
// 完整时间戳:YYYYMMDD HH:MM:SS
|
|
expect(RegExp(r'^\d{8} \d{2}:\d{2}:\d{2} ', multiLine: true).hasMatch(text), isTrue);
|
|
});
|
|
|
|
test('清理 7 天前的旧日志,保留新日志', () {
|
|
final old = File('${tmp.path}/app-20200101.log')..writeAsStringSync('old');
|
|
expect(old.existsSync(), isTrue);
|
|
FileLog.init(tmp.path); // 重新 init 触发清理
|
|
expect(old.existsSync(), isFalse, reason: '7 天前的日志应被删除');
|
|
expect(FileLog.currentPath != null, isTrue, reason: '当天日志正常打开');
|
|
});
|
|
|
|
test('未 init(目录不可用)时 write 静默不抛', () {
|
|
FileLog.dispose();
|
|
// 不 init 直接 write:无句柄,应静默通过
|
|
FileLog.write('no sink');
|
|
});
|
|
}
|