Skip to content

Commit 4bbdbff

Browse files
committed
Added levelColors and levelEmojis for per-instance customization
1 parent 9504193 commit 4bbdbff

File tree

2 files changed

+103
-14
lines changed

2 files changed

+103
-14
lines changed

lib/src/printers/pretty_printer.dart

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class PrettyPrinter extends LogPrinter {
2525
static const doubleDivider = '─';
2626
static const singleDivider = '┄';
2727

28-
static final levelColors = {
28+
static final Map<Level, AnsiColor> defaultLevelColors = {
2929
Level.trace: AnsiColor.fg(AnsiColor.grey(0.5)),
3030
Level.debug: const AnsiColor.none(),
3131
Level.info: const AnsiColor.fg(12),
@@ -34,13 +34,13 @@ class PrettyPrinter extends LogPrinter {
3434
Level.fatal: const AnsiColor.fg(199),
3535
};
3636

37-
static final levelEmojis = {
37+
static final Map<Level, String> defaultLevelEmojis = {
3838
Level.trace: '',
39-
Level.debug: '🐛 ',
40-
Level.info: '💡 ',
41-
Level.warning: '⚠️ ',
42-
Level.error: '⛔ ',
43-
Level.fatal: '👾 ',
39+
Level.debug: '🐛',
40+
Level.info: '💡',
41+
Level.warning: '⚠️',
42+
Level.error: '⛔',
43+
Level.fatal: '👾',
4444
};
4545

4646
/// Matches a stacktrace line as generated on Android/iOS devices.
@@ -173,6 +173,16 @@ class PrettyPrinter extends LogPrinter {
173173
String _middleBorder = '';
174174
String _bottomBorder = '';
175175

176+
/// Controls the colors used for the different log levels.
177+
///
178+
/// Default fallbacks are modifiable via [defaultLevelColors].
179+
final Map<Level, AnsiColor>? levelColors;
180+
181+
/// Controls the emojis used for the different log levels.
182+
///
183+
/// Default fallbacks are modifiable via [defaultLevelEmojis].
184+
final Map<Level, String>? levelEmojis;
185+
176186
PrettyPrinter({
177187
this.stackTraceBeginIndex = 0,
178188
this.methodCount = 2,
@@ -184,6 +194,8 @@ class PrettyPrinter extends LogPrinter {
184194
this.excludeBox = const {},
185195
this.noBoxingByDefault = false,
186196
this.excludePaths = const [],
197+
this.levelColors,
198+
this.levelEmojis,
187199
}) {
188200
_startTime ??= DateTime.now();
189201

@@ -355,19 +367,21 @@ class PrettyPrinter extends LogPrinter {
355367
}
356368

357369
AnsiColor _getLevelColor(Level level) {
370+
AnsiColor? color;
358371
if (colors) {
359-
return levelColors[level]!;
360-
} else {
361-
return const AnsiColor.none();
372+
color = levelColors?[level] ?? defaultLevelColors[level];
362373
}
374+
return color ?? const AnsiColor.none();
363375
}
364376

365377
String _getEmoji(Level level) {
366378
if (printEmojis) {
367-
return levelEmojis[level]!;
368-
} else {
369-
return '';
379+
final String? emoji = levelEmojis?[level] ?? defaultLevelEmojis[level];
380+
if (emoji != null) {
381+
return '$emoji ';
382+
}
370383
}
384+
return '';
371385
}
372386

373387
List<String> _formatAndPrint(

test/printers/pretty_printer_test.dart

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,85 @@ void main() {
1919

2020
final actualLog = emojiPrettyPrinter.log(event);
2121
final actualLogString = readMessage(actualLog);
22-
expect(actualLogString, contains(PrettyPrinter.levelEmojis[Level.debug]));
22+
expect(actualLogString,
23+
contains(PrettyPrinter.defaultLevelEmojis[Level.debug]));
2324
expect(actualLogString, contains(expectedMessage));
2425
});
2526

27+
test('should print custom emoji or fallback', () {
28+
final expectedMessage = 'some message with an emoji';
29+
final emojiPrettyPrinter = PrettyPrinter(
30+
printEmojis: true,
31+
levelEmojis: {
32+
Level.debug: '🧵',
33+
},
34+
);
35+
36+
final firstEvent = LogEvent(
37+
Level.debug,
38+
expectedMessage,
39+
'some error',
40+
StackTrace.current,
41+
);
42+
final emojiLogString = readMessage(emojiPrettyPrinter.log(firstEvent));
43+
expect(
44+
emojiLogString,
45+
contains(
46+
'${emojiPrettyPrinter.levelEmojis![Level.debug]!} $expectedMessage'),
47+
);
48+
49+
final secondEvent = LogEvent(
50+
Level.info,
51+
expectedMessage,
52+
'some error',
53+
StackTrace.current,
54+
);
55+
final fallbackEmojiLogString =
56+
readMessage(emojiPrettyPrinter.log(secondEvent));
57+
expect(
58+
fallbackEmojiLogString,
59+
contains(
60+
'${PrettyPrinter.defaultLevelEmojis[Level.info]!} $expectedMessage'),
61+
);
62+
});
63+
64+
test('should print custom color or fallback', () {
65+
final expectedMessage = 'some message with a color';
66+
final coloredPrettyPrinter = PrettyPrinter(
67+
colors: true,
68+
levelColors: {
69+
Level.debug: const AnsiColor.fg(50),
70+
},
71+
);
72+
73+
final firstEvent = LogEvent(
74+
Level.debug,
75+
expectedMessage,
76+
'some error',
77+
StackTrace.current,
78+
);
79+
final coloredLogString = readMessage(coloredPrettyPrinter.log(firstEvent));
80+
expect(coloredLogString, contains(expectedMessage));
81+
expect(
82+
coloredLogString,
83+
startsWith(coloredPrettyPrinter.levelColors![Level.debug]!.toString()),
84+
);
85+
86+
final secondEvent = LogEvent(
87+
Level.info,
88+
expectedMessage,
89+
'some error',
90+
StackTrace.current,
91+
);
92+
final fallbackColoredLogString =
93+
readMessage(coloredPrettyPrinter.log(secondEvent));
94+
expect(fallbackColoredLogString, contains(expectedMessage));
95+
expect(
96+
fallbackColoredLogString,
97+
startsWith(PrettyPrinter.defaultLevelColors[Level.info]!.toString()),
98+
);
99+
});
100+
26101
test('deal with string type message', () {
27102
final prettyPrinter = PrettyPrinter();
28103
final expectedMessage = 'normally computed message';

0 commit comments

Comments
 (0)