feat:日志修改

This commit is contained in:
dzc committed 2026-07-27 10:51:35 +08:00
1 parent da3eee48c1
commit 5b9ef49564
5 files changed
+147 -49

No files matched your search

+52 -25
View File
@@ -8,6 +8,7 @@ import 'package:logger/logger.dart';
import 'package:pj_supermarket_cloud/common/index.dart';
final logger = Logger(
filter: AppLogFilter(),
printer: customPrinter,
output: ConsoleOutput(),
);
@@ -18,38 +19,58 @@ final customPrinter = PrettyPrinter(
colors: true,
printEmojis: false,
printTime: true,
noBoxingByDefault: true,
);
class AppLogFilter extends LogFilter {
@override
bool shouldLog(LogEvent event) {
return true;
}
}
class ConsoleOutput extends LogOutput {
String? _filePath;
IOSink? _sink;
Timer? _timer;
Future<void> _queue = Future.value();
Future<void> _enqueue(Future<void> Function() action) {
_queue = _queue.then((_) => action()).catchError((e, stack) {
print("写入日志错误error:|$e|stack:|$stack|");
});
return _queue;
}
@override
Future<void> init() async {
try {
// 关闭旧的sink并创建新的
await _sink?.flush();
await _sink?.close();
_filePath = await AppFileTool.getLoggerBackupPath();
if (ObjectUtil.isNotEmpty(_filePath)) {
_sink = File(_filePath!).openWrite(
mode: FileMode.writeOnlyAppend,
encoding: utf8,
);
}
await _enqueue(() async {
await _sink?.flush();
await _sink?.close();
_filePath = await AppFileTool.getLoggerBackupPath();
if (ObjectUtil.isNotEmpty(_filePath)) {
_sink = File(_filePath!).openWrite(
mode: FileMode.writeOnlyAppend,
encoding: utf8,
);
} else {
_sink = null;
}
});
_timer = Timer.periodic(const Duration(seconds: 60 * 60 * 2),
(Timer timer) async {
final path = await AppFileTool.getLoggerBackupPath();
if (path == null) return;
// 关闭旧的sink并创建新的
await _sink?.flush();
await _sink?.close();
_filePath = path;
_sink = File(_filePath!).openWrite(
mode: FileMode.writeOnlyAppend,
encoding: utf8,
);
unawaited(_enqueue(() async {
await _sink?.flush();
await _sink?.close();
_filePath = path;
_sink = File(_filePath!).openWrite(
mode: FileMode.writeOnlyAppend,
encoding: utf8,
);
}));
});
} catch (e, stack) {
print("初始化日志错误error:|$e|stack:|$stack|");
@@ -58,9 +79,13 @@ class ConsoleOutput extends LogOutput {
@override
Future<void> destroy() async {
await _sink?.flush();
await _sink?.close();
_timer?.cancel();
_timer = null;
await _enqueue(() async {
await _sink?.flush();
await _sink?.close();
_sink = null;
});
}
@override
@@ -70,12 +95,14 @@ class ConsoleOutput extends LogOutput {
for (final v in event.lines) {
print(v);
}
} else {
if (_filePath == null) return;
if (_sink == null) return;
if (Level.debug == event.level) return;
_sink?.writeAll(event.lines, '\n');
}
unawaited(_enqueue(() async {
if (_filePath == null || _sink == null) return;
if (Level.debug == event.level) return;
_sink!.writeAll(event.lines, '\n');
_sink!.writeln();
await _sink!.flush();
}));
} catch (e, stack) {
print("写入日志错误error:|$e|stack:|$stack|");
}
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';
import 'package:mqtt_client/mqtt_client.dart';
@@ -44,6 +45,7 @@ class SyncCheckTool {
checkPrint();
checkBroadcast();
checkDeviceStatus();
checkExpiredLog();
}
void dispose() {
@@ -156,4 +158,54 @@ class SyncCheckTool {
}
});
}
// 检查过期日志(超过3个月的日志文件都要删除)
checkExpiredLog() async {
const logMsg = "检查过期日志";
try {
final backupPath = await AppFileTool.getLoggerBackupPath();
if (backupPath == null || backupPath.isEmpty) {
logger.w("|$_tag|$logMsg,日志备份路径为空");
return;
}
final loggerBackupDir = Directory(backupPath).parent.parent;
if (!await loggerBackupDir.exists()) {
logger.i("|$_tag|$logMsg,日志目录不存在 path:${loggerBackupDir.path}");
return;
}
final expireBefore = DateTime(
DateTime.now().year,
DateTime.now().month - 3,
DateTime.now().day,
);
final entities = loggerBackupDir.listSync(recursive: true);
int deleteCount = 0;
for (final entity in entities) {
if (entity is! File) continue;
if (!entity.path.endsWith(".log")) continue;
final stat = await entity.stat();
if (stat.modified.isBefore(expireBefore)) {
await entity.delete();
deleteCount++;
logger.i("|$_tag|$logMsg,删除过期日志 path:${entity.path}");
}
}
final monthDirs = loggerBackupDir
.listSync()
.whereType<Directory>()
.toList()
..sort((a, b) => b.path.compareTo(a.path));
for (final dir in monthDirs) {
if (!await dir.exists()) continue;
final isEmpty = dir.listSync().isEmpty;
if (isEmpty) {
await dir.delete();
logger.i("|$_tag|$logMsg,删除空目录 path:${dir.path}");
}
}
logger.i("|$_tag|$logMsg,执行完成,删除日志数量:$deleteCount");
} catch (e, stack) {
logger.e("|$_tag|$logMsg,执行失败,error:$e,stack:$stack");
}
}
}