Add File Logger

This commit is contained in:
2023-08-31 14:56:13 +08:00
parent f0ff06fb3e
commit 252b1c018d
2 changed files with 125 additions and 5 deletions

103
lib/logs/file.dart Normal file
View File

@@ -0,0 +1,103 @@
import 'dart:io' as io;
import 'package:file/file.dart';
import 'package:file/local.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import '../globals.dart';
import '../utils.dart';
class LogsFile {
LogsFile();
Directory? _cachedLogDirectory;
FileSystem fs = const LocalFileSystem();
DateTime? _startTime;
DateTime? _endTime;
File? _cachedFile;
IOSink? _cached;
Future<void> init() async {
if (_cachedLogDirectory != null) return;
if (isWindows) {
try {
final p = await platformPath.getCurrentExe();
if (p != null) {
final dir = fs.directory(path.join(path.dirname(p), "logs"));
if (!(await dir.exists())) {
await dir.create(recursive: true);
}
_cachedLogDirectory = dir;
return;
}
} catch (e) {
// Do nothing
}
}
final io.Directory appSupportDir = await getApplicationSupportDirectory();
final dir = fs.directory(path.join(appSupportDir.path, "logs"));
if (!(await dir.exists())) {
await dir.create(recursive: true);
}
_cachedLogDirectory = dir;
final d = _file(DateTime.now());
if (d == null) {
throw Exception("Failed to create log file.");
}
return;
}
IOSink? _file(DateTime now) {
if (_cached != null &&
_cachedFile != null &&
_startTime != null &&
_endTime != null) {
if (now.isAfter(_startTime!) && now.isBefore(_endTime!)) {
return _cached;
}
}
if (_cached != null) {
_cached!.close();
}
final dir = _cachedLogDirectory;
if (dir == null) return null;
final n = now.isUtc ? now.toLocal() : now;
final year = n.year.toString().padLeft(4, '0');
final month = n.month.toString().padLeft(2, '0');
final day = n.day.toString().padLeft(2, '0');
final f = dir.childFile("$year-$month-$day.log");
if (!f.existsSync()) {
f.createSync(recursive: true);
}
_cachedFile = f;
_cached = f.openWrite(mode: FileMode.append);
_startTime = DateTime(n.year, n.month, n.day);
_endTime = _startTime!.add(const Duration(days: 1));
return _cached;
}
bool log(LogRecord record) {
final stack = record.stackTrace != null ? '\n${record.stackTrace}' : '';
final error = record.error != null ? '${record.error}' : '';
final t = record.time;
final hour = t.hour.toString().padLeft(2, '0');
final minute = t.minute.toString().padLeft(2, '0');
final second = t.second.toString().padLeft(2, '0');
final millisecond = t.millisecond.toString().padLeft(3, '0');
final time = "$hour:$minute:$second.$millisecond";
final logText =
'${record.level.name}: ${record.loggerName}: $time: ${record.message}$error$stack';
try {
final file = _file(record.time);
if (file == null) {
return false;
}
file.write("$logText\n");
return true;
} catch (_) {
return false;
}
}
Future<void> flush() async {
await _cached?.flush();
}
}

View File

@@ -9,6 +9,7 @@ import 'package:window_manager/window_manager.dart';
import 'globals.dart';
import 'home.dart';
import 'login.dart';
import 'logs/file.dart';
import 'set_server.dart';
import 'utils.dart';
@@ -29,17 +30,33 @@ final _router = GoRouter(
],
);
void defaultLogger(LogRecord record) {
final stack = record.stackTrace != null ? '\n${record.stackTrace}' : '';
final error = record.error != null ? '${record.error}' : '';
// ignore: avoid_print
print(
'${record.level.name}: ${record.loggerName}: ${record.time}: ${record.message}$error$stack');
}
Future<void> initLogger() async {
var logLevel = prefs.getInt("logLevel");
var logLevelName = prefs.getString("logLevelName");
if (logLevel != null && logLevelName != null) {
Logger.root.level = Level(logLevelName, logLevel);
}
Logger.root.onRecord.listen((record) {
final stack = record.stackTrace != null ? '\n${record.stackTrace}' : '';
print(
'${record.level.name}: ${record.time}: ${record.message}${record.error}$stack');
});
if (!kIsWeb) {
try {
final logFile = LogsFile();
await logFile.init();
Logger.root.onRecord.listen((record) {
if (!logFile.log(record)) defaultLogger(record);
});
return;
} catch (_) {
// Do nothing
}
}
Logger.root.onRecord.listen(defaultLogger);
return;
}