Skip to content

Commit d045820

Browse files
committed
Add LogfmtPrinter
1 parent d8a9cd7 commit d045820

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

lib/logger.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export 'src/outputs/stream_output.dart';
1010
export 'src/outputs/memory_output.dart';
1111
export 'src/printers/pretty_printer.dart';
1212
export 'src/printers/simple_printer.dart';
13+
export 'src/printers/logfmt_printer.dart';
1314

1415
export 'src/log_output.dart'
1516
if (dart.library.io) 'src/outputs/file_output.dart';
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'package:logger/src/log_printer.dart';
2+
import 'package:logger/src/logger.dart';
3+
4+
/// Outputs a logfmt message:
5+
/// ```
6+
/// level=debug msg="hi there" time="2015-03-26T01:27:38-04:00" animal=walrus number=8 tag=usum
7+
/// ```
8+
class LogfmtPrinter extends LogPrinter {
9+
static final levelPrefixes = {
10+
Level.verbose: 'verbose',
11+
Level.debug: 'debug',
12+
Level.info: 'info',
13+
Level.warning: 'warning',
14+
Level.error: 'error',
15+
Level.wtf: 'wtf',
16+
};
17+
18+
@override
19+
List<String> log(LogEvent event) {
20+
var output = StringBuffer("level=${levelPrefixes[event.level]}");
21+
if (event.message is String) {
22+
output.write(' msg="${event.message}"');
23+
} else if (event.message is Map) {
24+
event.message.entries.forEach((entry) {
25+
if (entry.value is num) {
26+
output.write(' ${entry.key}=${entry.value}');
27+
} else {
28+
output.write(' ${entry.key}="${entry.value}"');
29+
}
30+
});
31+
}
32+
33+
return [output.toString()];
34+
}
35+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import 'package:test/test.dart';
2+
import 'package:logger/logger.dart';
3+
4+
void main() {
5+
var printer = LogfmtPrinter();
6+
7+
test('includes level', () {
8+
expect(
9+
printer.log(LogEvent(
10+
Level.debug,
11+
"some message",
12+
Exception("boom"),
13+
StackTrace.current,
14+
))[0],
15+
contains("level=debug"),
16+
);
17+
});
18+
19+
test('with a string message includes a msg key', () {
20+
expect(
21+
printer.log(LogEvent(
22+
Level.debug,
23+
"some message",
24+
Exception("boom"),
25+
StackTrace.current,
26+
))[0],
27+
contains('msg="some message"'));
28+
});
29+
30+
test('includes random key=value pairs', () {
31+
var output = printer.log(LogEvent(
32+
Level.debug,
33+
{'a': 123, 'foo': 'bar baz'},
34+
Exception("boom"),
35+
StackTrace.current,
36+
))[0];
37+
38+
expect(output, contains("a=123"));
39+
expect(output, contains('foo="bar baz"'));
40+
});
41+
42+
test('handles a stacktrace', () {}, skip: "TODO");
43+
test('handles an error/exception', () {}, skip: "TODO");
44+
}

0 commit comments

Comments
 (0)