144 lines
3.1 KiB
Dart
144 lines
3.1 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:logger/logger.dart';
|
|
|
|
Level _minimumLogLevel() {
|
|
const raw = String.fromEnvironment('KOMET_LOG_LEVEL', defaultValue: '');
|
|
switch (raw.toLowerCase()) {
|
|
case 'trace':
|
|
return Level.trace;
|
|
case 'debug':
|
|
return Level.debug;
|
|
case 'info':
|
|
return Level.info;
|
|
case 'warning':
|
|
case 'warn':
|
|
return Level.warning;
|
|
case 'error':
|
|
return Level.error;
|
|
case 'fatal':
|
|
return Level.fatal;
|
|
case 'off':
|
|
return Level.off;
|
|
default:
|
|
break;
|
|
}
|
|
if (kReleaseMode) {
|
|
return Level.info;
|
|
}
|
|
return Level.trace;
|
|
}
|
|
|
|
LogFilter _logFilter() {
|
|
if (kReleaseMode) {
|
|
return ProductionFilter();
|
|
}
|
|
return DevelopmentFilter();
|
|
}
|
|
|
|
final logger = Logger(
|
|
filter: _logFilter(),
|
|
level: _minimumLogLevel(),
|
|
printer: KometLogPrinter(),
|
|
output: ConsoleOutput(),
|
|
);
|
|
|
|
int _importanceSortKey(Level level) {
|
|
final v = level.value;
|
|
if (v >= 5999) {
|
|
return 0;
|
|
}
|
|
if (v >= 5000) {
|
|
return 1;
|
|
}
|
|
if (v >= 4000) {
|
|
return 2;
|
|
}
|
|
if (v >= 3000) {
|
|
return 3;
|
|
}
|
|
if (v >= 2000) {
|
|
return 4;
|
|
}
|
|
return 5;
|
|
}
|
|
|
|
String _levelLetter(Level level) {
|
|
final v = level.value;
|
|
if (v >= 5999) {
|
|
return 'F';
|
|
}
|
|
if (v >= 5000) {
|
|
return 'E';
|
|
}
|
|
if (v >= 4000) {
|
|
return 'W';
|
|
}
|
|
if (v >= 3000) {
|
|
return 'I';
|
|
}
|
|
if (v >= 2000) {
|
|
return 'D';
|
|
}
|
|
return 'T';
|
|
}
|
|
|
|
AnsiColor _levelColor(Level level) {
|
|
final v = level.value;
|
|
if (v >= 5999) {
|
|
return const AnsiColor.fg(199);
|
|
}
|
|
if (v >= 5000) {
|
|
return const AnsiColor.fg(196);
|
|
}
|
|
if (v >= 4000) {
|
|
return const AnsiColor.fg(208);
|
|
}
|
|
if (v >= 3000) {
|
|
return const AnsiColor.fg(12);
|
|
}
|
|
if (v >= 2000) {
|
|
return const AnsiColor.none();
|
|
}
|
|
return AnsiColor.fg(AnsiColor.grey(0.5));
|
|
}
|
|
|
|
class KometLogPrinter extends LogPrinter {
|
|
KometLogPrinter({this.colors = true});
|
|
|
|
final bool colors;
|
|
|
|
@override
|
|
List<String> log(LogEvent event) {
|
|
final lines = <String>[];
|
|
final t = event.time;
|
|
final timeStr =
|
|
'${t.hour.toString().padLeft(2, '0')}:${t.minute.toString().padLeft(2, '0')}:${t.second.toString().padLeft(2, '0')}.${t.millisecond.toString().padLeft(3, '0')}';
|
|
final ord = _importanceSortKey(event.level).toString().padLeft(2, '0');
|
|
final letter = _levelLetter(event.level);
|
|
final label = colors ? _levelColor(event.level)(letter) : letter;
|
|
final msg = _stringifyMessage(event.message);
|
|
lines.add('$ord|$timeStr $label $msg');
|
|
if (event.error != null) {
|
|
lines.add('${' ' * 3}| ${event.error}');
|
|
}
|
|
if (event.stackTrace != null && event.level.value >= 5000) {
|
|
final st = event.stackTrace.toString().split('\n');
|
|
const limit = 12;
|
|
for (var i = 0; i < st.length && i < limit; i++) {
|
|
lines.add('${' ' * 3}| ${st[i]}');
|
|
}
|
|
}
|
|
return lines;
|
|
}
|
|
|
|
String _stringifyMessage(dynamic message) {
|
|
final finalMessage = message is Function ? message() : message;
|
|
if (finalMessage is Map || finalMessage is Iterable) {
|
|
return const JsonEncoder.withIndent(null).convert(finalMessage);
|
|
}
|
|
return finalMessage.toString();
|
|
}
|
|
}
|