Skip to content

Commit 1593cc8

Browse files
maarztctrueden
authored andcommitted
StderrLogService: allow overriding output streams
Now, the setPrintStreams method lets the caller define which output stream is used for each log level. This commit also adds a regression test verifying that the log is written to output streams as expected. Signed-off-by: Curtis Rueden <ctrueden@wisc.edu>
1 parent 65c10f7 commit 1593cc8

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

src/main/java/org/scijava/log/StderrLogService.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
package org.scijava.log;
3434

3535
import java.io.PrintStream;
36+
import java.util.function.Function;
3637

3738
import org.scijava.Priority;
3839
import org.scijava.plugin.Plugin;
@@ -52,10 +53,16 @@
5253
@Plugin(type = Service.class, priority = Priority.LOW)
5354
public class StderrLogService extends AbstractLogService {
5455

56+
private Function<Integer, PrintStream> levelToStream =
57+
level -> (level <= LogLevel.WARN) ? System.err : System.out;
58+
59+
public void setPrintStreams(Function<Integer, PrintStream> levelToStream) {
60+
this.levelToStream = levelToStream;
61+
}
62+
5563
@Override
56-
public void notifyListeners(final LogMessage message) {
57-
final PrintStream out = (message.level() <= LogLevel.WARN) ? System.err
58-
: System.out;
64+
public void notifyListeners(LogMessage message) {
65+
final PrintStream out = levelToStream.apply(message.level());
5966
out.print(message);
6067
}
6168
}

src/test/java/org/scijava/log/StderrLogServiceTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,44 @@
3535
import static org.junit.Assert.assertTrue;
3636
import static org.scijava.log.LogLevel.WARN;
3737

38+
import java.io.ByteArrayOutputStream;
39+
import java.io.PrintStream;
40+
3841
import org.junit.Test;
3942

4043
/**
4144
* Tests {@link StderrLogService}.
4245
*
4346
* @author Johannes Schindelin
47+
* @author Matthias Arzt
4448
*/
4549
public class StderrLogServiceTest {
50+
4651
@Test
4752
public void testDefaultLevel() {
4853
final LogService log = new StderrLogService();
4954
int level = log.getLevel();
5055
assertTrue("default level (" + level + //
5156
") is at least INFO(" + WARN + ")", level >= WARN);
5257
}
58+
59+
@Test
60+
public void testOutputToStream() {
61+
// setup
62+
final StderrLogService logService = new StderrLogService();
63+
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
64+
final PrintStream p = new PrintStream(outputStream);
65+
logService.setPrintStreams(ignore -> p);
66+
67+
final String text1 = "Hello World!";
68+
final String text2 = "foo bar";
69+
70+
// process
71+
logService.warn(text1);
72+
logService.subLogger("sub").error(text2);
73+
74+
// test
75+
assertTrue(outputStream.toString().contains(text1));
76+
assertTrue(outputStream.toString().contains(text2));
77+
}
5378
}

0 commit comments

Comments
 (0)