2024-05-18 09:37:50 +08:00

93 lines
2.7 KiB
Dart
Executable File

import 'dart:io';
import 'package:flutter/material.dart';
class DebugConsoleLog {
/// Message of the log.
final String message;
/// Log level, used to determine the color and importance of the log.
final DebugConsoleLevel level;
/// Time of when the log was created.
final DateTime timestamp;
final StackTrace? stackTrace;
DebugConsoleLog({
Object? message,
this.level = DebugConsoleLevel.normal,
DateTime? timestamp,
this.stackTrace,
}) : message = '$message',
timestamp = timestamp ?? DateTime.now();
@override
String toString() {
return '[$level] $timestamp\n$message\n---${stackTrace != null ? ':' : ''}\n${stackTrace != null ? '${stackTrace ?? ''}---\n' : ''}';
}
static List<DebugConsoleLog> fromFile(String filePath) {
final List<DebugConsoleLog> logs = [];
final File file = File(filePath);
if (!file.existsSync()) return logs;
final RegExp regex = RegExp(
r'\[(?<level>.*)\] (?<timestamp>.*)\n(?<message>(?:.|\n)*?)\n---(?::\n(?<stackTrace>(?:.|\n)*?)---\n)?',
multiLine: true,
);
final matches = regex.allMatches(file.readAsStringSync());
for (final match in matches) {
final String level = match.namedGroup('level') ?? 'normal';
final String timestamp = match.namedGroup('timestamp') ?? '';
final String message = match.namedGroup('message') ?? '';
final String stackTrace = match.namedGroup('stackTrace') ?? '';
logs.add(DebugConsoleLog(
message: message,
level: DebugConsoleLevel.values.firstWhere(
(DebugConsoleLevel findingLevel) =>
level.toString() == findingLevel.toString(),
orElse: () => DebugConsoleLevel.normal,
),
timestamp: DateTime.parse(timestamp),
stackTrace:
stackTrace.isNotEmpty ? StackTrace.fromString(stackTrace) : null,
));
}
return logs;
}
}
class DebugConsoleLevel {
static const DebugConsoleLevel normal = DebugConsoleLevel('Normal');
static const DebugConsoleLevel info =
DebugConsoleLevel('Info', Colors.lightBlueAccent);
static const DebugConsoleLevel warning =
DebugConsoleLevel('Warning', Colors.deepOrange);
static const DebugConsoleLevel error =
DebugConsoleLevel('Error', Colors.redAccent);
static const DebugConsoleLevel fatal = DebugConsoleLevel('Fatal', Colors.red);
static const DebugConsoleLevel debug =
DebugConsoleLevel('Debug', Colors.blue);
static const List<DebugConsoleLevel> values = [
normal,
info,
warning,
error,
fatal,
debug,
];
final String name;
final Color? color;
const DebugConsoleLevel(this.name, [this.color]);
@override
String toString() => name;
}