-
Notifications
You must be signed in to change notification settings - Fork 1
/
simple_formatter.dart
80 lines (73 loc) · 2.18 KB
/
simple_formatter.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import 'dart:convert';
import 'dart:math';
import 'package:dog/src/formatter.dart';
import 'package:dog/src/record.dart';
import 'package:dog/src/util/utils.dart';
/// This formatter will not generate borders.
class SimpleFormatter extends Formatter {
/// The level we will retrieve from StackTrace.
final int stackTraceLevel;
/// Function to get caller info.
final MessageCallback? callerGetter;
SimpleFormatter({
this.stackTraceLevel = 10,
this.callerGetter = DogUtils.defaultCallerInfo,
});
@override
List<String> format(Record record) {
List<String> lines = [];
// tag/level time caller
String? caller = callerGetter?.call().toString();
lines.add('${record.dateTime.toIso8601String()}'
' ${record.tag ?? record.level.name}'
'${caller == null ? '' : (' (' + caller + ')')}');
// title
if (record.title != null) {
lines.add(record.title!);
}
// message
String msg = convertMessage(record.message);
lines.add(msg);
// stack trace
if (record.stackTrace != null) {
String st = convertStackTrace(record.stackTrace!);
lines.add(st);
}
return lines;
}
String convertMessage(dynamic message) {
String msg;
if (message is String) {
msg = message;
} else if (message is Map || message is Iterable) {
try {
msg = jsonEncode(message);
} catch (e) {
// JsonUnsupportedObjectError
msg = message.toString();
}
} else if (message is MessageCallback) {
msg = message().toString();
} else if (message is Exception) {
msg = message.toString();
} else if (message is StackTrace) {
msg = convertStackTrace(message);
} else {
msg = message.toString();
}
return msg;
}
/// [stackTraceLevel] lines at most.
String convertStackTrace(StackTrace stackTrace) {
String st = stackTrace.toString();
List<String> lines = st.split('\n');
int length = lines.length;
st = length <= stackTraceLevel
? st
: lines.sublist(0, min(length, stackTraceLevel)).join('\n');
if (st.endsWith('\n')) {
st = st.substring(0, st.length - 2); // rm the last empty line.
}
return st;
}
}