Skip to content

Commit c5efa73

Browse files
committed
Add MultiOutput
This output sends events to different other outputs in parallel. Credits go @gmpassos!
1 parent 206c20d commit c5efa73

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

lib/logger.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export 'src/filters/production_filter.dart';
99
export 'src/outputs/console_output.dart';
1010
export 'src/outputs/stream_output.dart';
1111
export 'src/outputs/memory_output.dart';
12+
export 'src/outputs/multi_output.dart';
1213

1314
export 'src/printers/pretty_printer.dart';
1415
export 'src/printers/logfmt_printer.dart';

lib/src/outputs/multi_output.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:logger/src/log_output.dart';
2+
import 'package:logger/src/logger.dart';
3+
4+
/// Logs simultaneously to multiple [LogOutput] outputs.
5+
class MultiOutput extends LogOutput {
6+
List<LogOutput> _outputs;
7+
8+
MultiOutput(List<LogOutput> outputs) {
9+
_outputs = _normalizeOutputs(outputs);
10+
}
11+
12+
List<LogOutput> _normalizeOutputs(List<LogOutput> outputs) {
13+
if (outputs == null) return [];
14+
15+
outputs.removeWhere((o) => o == null);
16+
17+
return outputs;
18+
}
19+
20+
@override
21+
void output(OutputEvent event) {
22+
_outputs.forEach((o) => o.output(event));
23+
}
24+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import 'package:logger/logger.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
test('Multiple outputs are populated with the same events', () {
6+
final output1 = MemoryOutput(bufferSize: 2);
7+
final output2 = MemoryOutput(bufferSize: 2);
8+
9+
final multiOutput = MultiOutput([output1, output2]);
10+
11+
final event0 = OutputEvent(Level.info, []);
12+
multiOutput.output(event0);
13+
14+
expect(output1.buffer.length, 1);
15+
expect(output2.buffer.length, 1);
16+
expect(output1.buffer.elementAt(0), equals(output2.buffer.elementAt(0)));
17+
expect(output1.buffer.elementAt(0), equals(event0));
18+
19+
final event1 = OutputEvent(Level.info, []);
20+
multiOutput.output(event1);
21+
22+
expect(output1.buffer.length, 2);
23+
expect(output2.buffer.length, 2);
24+
expect(output1.buffer.elementAt(0), equals(output2.buffer.elementAt(0)));
25+
expect(output1.buffer.elementAt(0), equals(event0));
26+
expect(output1.buffer.elementAt(1), equals(output2.buffer.elementAt(1)));
27+
expect(output1.buffer.elementAt(1), equals(event1));
28+
});
29+
30+
test('passing null does not throw an exception', () {
31+
final output = MultiOutput(null);
32+
output.output(OutputEvent(Level.info, []));
33+
});
34+
35+
test('passing null in the list does not throw an exception', () {
36+
final output = MultiOutput([null]);
37+
output.output(OutputEvent(Level.info, []));
38+
});
39+
}

0 commit comments

Comments
 (0)