Skip to content

Commit 7641cfc

Browse files
authored
Merge pull request #771 from metafacture/164-addPrefixSetterForObjectAndStreamLoggers
Add setter for log prefix in `ObjectLogger` and `StreamLogger`.
2 parents e40185e + a1de2bf commit 7641cfc

10 files changed

Lines changed: 336 additions & 14 deletions

File tree

metafacture-monitoring/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ dependencies {
2222
implementation project(':metafacture-commons')
2323
testImplementation "junit:junit:${versions.junit}"
2424
testImplementation "org.mockito:mockito-core:${versions.mockito}"
25-
testRuntimeOnly slf4j_provider
25+
testImplementation "org.simplify4u:slf4j2-mock:${versions.slf4j_mock}"
2626
}

metafacture-monitoring/src/main/java/org/metafacture/monitoring/ObjectLogger.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,36 @@ public final class ObjectLogger<T>
4141

4242
private static final MetafactureLogger LOG = new MetafactureLogger(ObjectLogger.class);
4343

44-
private final String logPrefix;
44+
private String logPrefix = "";
4545

4646
/**
4747
* Creates an instance of {@link ObjectLogger}.
4848
*/
4949
public ObjectLogger() {
50-
this("");
5150
}
5251

5352
/**
5453
* Creates an instance of {@link ObjectLogger} by a given prefix of the log
5554
* messages.
5655
*
56+
* @deprecated Use {@link #setPrefix} instead.
57+
*
5758
* @param logPrefix the prefix of the log messages
5859
*/
60+
@Deprecated/*(since="9.0", forRemoval=true)*/
5961
public ObjectLogger(final String logPrefix) {
6062
this.logPrefix = logPrefix;
6163
}
6264

65+
/**
66+
* Sets the prefix used when logging messages.
67+
*
68+
* @param prefix the prefix of the log messages
69+
*/
70+
public void setPrefix(final String prefix) {
71+
this.logPrefix = prefix;
72+
}
73+
6374
@Override
6475
public void process(final T obj) {
6576
LOG.externalDebug("{}{}", logPrefix, obj);

metafacture-monitoring/src/main/java/org/metafacture/monitoring/StreamLogger.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,34 @@ public final class StreamLogger
4141

4242
private static final MetafactureLogger LOG = new MetafactureLogger(StreamLogger.class);
4343

44-
private final String logPrefix;
44+
private String logPrefix = "";
4545

4646
/**
4747
* Creates an instance of {@link StreamLogger}.
4848
*/
4949
public StreamLogger() {
50-
this("");
5150
}
5251

5352
/**
5453
* Creates an instance of {@link StreamLogger} by a given prefix used when log
5554
* messages.
5655
*
56+
* @deprecated Use {@link #setPrefix} instead.
57+
*
5758
* @param logPrefix the prefix of the log messages
5859
*/
60+
@Deprecated/*(since="9.0", forRemoval=true)*/
5961
public StreamLogger(final String logPrefix) {
60-
this.logPrefix = logPrefix;
62+
setPrefix(logPrefix);
63+
}
64+
65+
/**
66+
* Sets the prefix used when logging messages.
67+
*
68+
* @param prefix the prefix of the log messages
69+
*/
70+
public void setPrefix(final String prefix) {
71+
this.logPrefix = prefix;
6172
}
6273

6374
@Override
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
* Copyright 2026 hbz NRW
3+
*
4+
* Licensed under the Apache License, Version 2.0 the "License";
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.metafacture.monitoring;
18+
19+
import org.metafacture.framework.ObjectReceiver;
20+
21+
import org.junit.Before;
22+
import org.junit.Test;
23+
import org.junit.runner.RunWith;
24+
import org.mockito.InOrder;
25+
import org.mockito.Mock;
26+
import org.mockito.Mockito;
27+
import org.mockito.junit.MockitoJUnitRunner;
28+
import org.slf4j.Logger;
29+
30+
/**
31+
* Tests for class {@link ObjectLogger}.
32+
*
33+
* @author Jens Wille
34+
*
35+
*/
36+
@RunWith(MockitoJUnitRunner.class)
37+
public final class ObjectLoggerTest extends TestHelpers {
38+
39+
@Mock(name = "external.org.metafacture.monitoring.ObjectLogger")
40+
private Logger logLogger;
41+
42+
@Mock
43+
private ObjectReceiver<String> receiver;
44+
45+
private ObjectLogger<String> logger;
46+
47+
public ObjectLoggerTest() {
48+
}
49+
50+
@Before
51+
public void setup() {
52+
logger = new ObjectLogger<>();
53+
logger.setReceiver(receiver);
54+
}
55+
56+
@Test
57+
public void shouldForwardAllProcessedObjects() {
58+
logger.process("object");
59+
logger.resetStream();
60+
logger.closeStream();
61+
62+
final InOrder ordered = Mockito.inOrder(receiver);
63+
ordered.verify(receiver).process("object");
64+
ordered.verify(receiver).resetStream();
65+
ordered.verify(receiver).closeStream();
66+
ordered.verifyNoMoreInteractions();
67+
Mockito.verifyNoMoreInteractions(receiver);
68+
69+
assertLog(logLogger, "DEBUG", c -> {
70+
assertLog(c, "{}{}", "", "object");
71+
assertLog(c, "{}resetStream", "");
72+
assertLog(c, "{}closeStream", "");
73+
});
74+
}
75+
76+
@Test
77+
public void shouldActAsSinkIfNoReceiverIsSet() {
78+
logger.setReceiver(null);
79+
80+
logger.process("object");
81+
logger.resetStream();
82+
logger.closeStream();
83+
84+
Mockito.verifyNoMoreInteractions(receiver);
85+
86+
assertLog(logLogger, "DEBUG", c -> {
87+
assertLog(c, "{}{}", "", "object");
88+
assertLog(c, "{}resetStream", "");
89+
assertLog(c, "{}closeStream", "");
90+
});
91+
}
92+
93+
@Test
94+
public void shouldLogWithPrefix() {
95+
final String prefix = "prefix:";
96+
logger.setPrefix(prefix);
97+
98+
logger.process("object");
99+
logger.resetStream();
100+
logger.closeStream();
101+
102+
assertLog(logLogger, "DEBUG", c -> {
103+
assertLog(c, "{}{}", prefix, "object");
104+
assertLog(c, "{}resetStream", prefix);
105+
assertLog(c, "{}closeStream", prefix);
106+
});
107+
}
108+
109+
}

metafacture-monitoring/src/test/java/org/metafacture/monitoring/ObjectTimerTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,22 @@
2020

2121
import org.junit.Before;
2222
import org.junit.Test;
23+
import org.junit.runner.RunWith;
24+
import org.mockito.Mock;
25+
import org.mockito.junit.MockitoJUnitRunner;
26+
import org.slf4j.Logger;
2327

2428
/**
2529
* Tests for class {@link ObjectTimer}.
2630
*
2731
* @author Christoph Böhme
2832
*
2933
*/
30-
public final class ObjectTimerTest {
34+
@RunWith(MockitoJUnitRunner.class)
35+
public final class ObjectTimerTest extends TestHelpers {
36+
37+
@Mock(name = "external.org.metafacture.monitoring.TimerBase")
38+
private Logger logger;
3139

3240
private ObjectTimer<String> objectTimer;
3341
private BenchmarkedModule benchmarkedModule;
@@ -44,18 +52,34 @@ public void setup() {
4452

4553
@Test
4654
public void testShouldMeasureExecutionTime() {
47-
4855
objectTimer.process("");
4956
objectTimer.process("");
5057
objectTimer.process("");
5158
objectTimer.process("");
5259
objectTimer.closeStream();
60+
61+
assertLog(logger, "", 4);
5362
}
5463

5564
@Test
5665
public void testShouldHandleImmediateCloseStreamWithNoProcessing() {
66+
objectTimer.closeStream();
67+
assertLog(logger, "", 0);
68+
}
5769

70+
@Test
71+
public void shouldLogWithPrefix() {
72+
final String prefix = "prefix:";
73+
objectTimer = new ObjectTimer<>(prefix);
74+
objectTimer.setReceiver(benchmarkedModule);
75+
76+
objectTimer.process("");
77+
objectTimer.process("");
78+
objectTimer.process("");
79+
objectTimer.process("");
5880
objectTimer.closeStream();
81+
82+
assertLog(logger, prefix, 4);
5983
}
6084

6185
/**

metafacture-monitoring/src/test/java/org/metafacture/monitoring/StreamLoggerTest.java

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020

2121
import org.junit.Before;
2222
import org.junit.Test;
23+
import org.junit.runner.RunWith;
2324
import org.mockito.InOrder;
2425
import org.mockito.Mock;
2526
import org.mockito.Mockito;
26-
import org.mockito.MockitoAnnotations;
27+
import org.mockito.junit.MockitoJUnitRunner;
28+
import org.slf4j.Logger;
2729

2830
/**
2931
* Tests for class {@link StreamLogger}.
@@ -32,7 +34,11 @@
3234
* @author Christoph Böhme (refactored to Mockito)
3335
*
3436
*/
35-
public final class StreamLoggerTest {
37+
@RunWith(MockitoJUnitRunner.class)
38+
public final class StreamLoggerTest extends TestHelpers {
39+
40+
@Mock(name = "external.org.metafacture.monitoring.StreamLogger")
41+
private Logger logLogger;
3642

3743
@Mock
3844
private StreamReceiver receiver;
@@ -44,7 +50,6 @@ public StreamLoggerTest() {
4450

4551
@Before
4652
public void setup() {
47-
MockitoAnnotations.initMocks(this);
4853
logger = new StreamLogger();
4954
logger.setReceiver(receiver);
5055
}
@@ -67,6 +72,18 @@ public void shouldForwardAllReceivedEvents() {
6772
ordered.verify(receiver).endRecord();
6873
ordered.verify(receiver).resetStream();
6974
ordered.verify(receiver).closeStream();
75+
ordered.verifyNoMoreInteractions();
76+
Mockito.verifyNoMoreInteractions(receiver);
77+
78+
assertLog(logLogger, "DEBUG", c -> {
79+
assertLog(c, "{}start record {}", "", "1");
80+
assertLog(c, "{}start entity {}", "", "entity");
81+
assertLog(c, "{}literal {}={}", "", "literal", "value");
82+
assertLog(c, "{}end entity", "");
83+
assertLog(c, "{}end record", "");
84+
assertLog(c, "{}resetStream", "");
85+
assertLog(c, "{}closeStream", "");
86+
});
7087
}
7188

7289
@Test
@@ -81,7 +98,41 @@ public void shouldActAsSinkIfNoReceiverIsSet() {
8198
logger.resetStream();
8299
logger.closeStream();
83100

84-
// No exceptions expected
101+
Mockito.verifyNoMoreInteractions(receiver);
102+
103+
assertLog(logLogger, "DEBUG", c -> {
104+
assertLog(c, "{}start record {}", "", "1");
105+
assertLog(c, "{}start entity {}", "", "entity");
106+
assertLog(c, "{}literal {}={}", "", "literal", "value");
107+
assertLog(c, "{}end entity", "");
108+
assertLog(c, "{}end record", "");
109+
assertLog(c, "{}resetStream", "");
110+
assertLog(c, "{}closeStream", "");
111+
});
112+
}
113+
114+
@Test
115+
public void shouldLogWithPrefix() {
116+
final String prefix = "prefix:";
117+
logger.setPrefix(prefix);
118+
119+
logger.startRecord("1");
120+
logger.startEntity("entity");
121+
logger.literal("literal", "value");
122+
logger.endEntity();
123+
logger.endRecord();
124+
logger.resetStream();
125+
logger.closeStream();
126+
127+
assertLog(logLogger, "DEBUG", c -> {
128+
assertLog(c, "{}start record {}", prefix, "1");
129+
assertLog(c, "{}start entity {}", prefix, "entity");
130+
assertLog(c, "{}literal {}={}", prefix, "literal", "value");
131+
assertLog(c, "{}end entity", prefix);
132+
assertLog(c, "{}end record", prefix);
133+
assertLog(c, "{}resetStream", prefix);
134+
assertLog(c, "{}closeStream", prefix);
135+
});
85136
}
86137

87138
}

0 commit comments

Comments
 (0)