Skip to content

Commit 4e690e0

Browse files
authored
Parameterized logging for JUL (#77)
1 parent 033d21f commit 4e690e0

File tree

9 files changed

+107
-6
lines changed

9 files changed

+107
-6
lines changed

ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@ void testSimpleLog() throws Exception {
5959
assertThat(getLastLogLine().get("message").textValue()).isEqualTo("test");
6060
}
6161

62+
@Test
63+
void testSimpleParameterizedLog() throws Exception {
64+
ParameterizedLogSupport parameterizedLogSupport = getParameterizedLogSettings();
65+
66+
// don't test parameterized logging if the log framework implementation does not support it.
67+
if (parameterizedLogSupport == ParameterizedLogSupport.NOT_SUPPORTED) {
68+
return;
69+
}
70+
71+
if (parameterizedLogSupport == ParameterizedLogSupport.NUMBER_AND_BRACKETS) {
72+
debug("{0} is not {1}", 1, 2);
73+
} else if (parameterizedLogSupport == ParameterizedLogSupport.BRACKETS_ONLY) {
74+
debug("{} is not {}", 1, 2);
75+
}
76+
77+
assertThat(getLastLogLine().get("message").textValue()).isEqualTo("1 is not 2");
78+
}
79+
6280
@Test
6381
void testThreadContext() throws Exception {
6482
if (putMdc("foo", "bar")) {
@@ -124,8 +142,14 @@ public boolean putNdc(String message) {
124142
return false;
125143
}
126144

145+
public ParameterizedLogSupport getParameterizedLogSettings() {
146+
return ParameterizedLogSupport.BRACKETS_ONLY;
147+
}
148+
127149
public abstract void debug(String message);
128150

151+
public abstract void debug(String message, Object... logParams);
152+
129153
public abstract void error(String message, Throwable t);
130154

131155
public abstract JsonNode getLastLogLine() throws IOException;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*-
2+
* #%L
3+
* Java ECS logging
4+
* %%
5+
* Copyright (C) 2019 - 2020 Elastic and contributors
6+
* %%
7+
* Licensed to Elasticsearch B.V. under one or more contributor
8+
* license agreements. See the NOTICE file distributed with
9+
* this work for additional information regarding copyright
10+
* ownership. Elasticsearch B.V. licenses this file to you under
11+
* the Apache License, Version 2.0 (the "License"); you may
12+
* not use this file except in compliance with the License.
13+
* You may obtain a copy of the License at
14+
*
15+
* http://www.apache.org/licenses/LICENSE-2.0
16+
*
17+
* Unless required by applicable law or agreed to in writing,
18+
* software distributed under the License is distributed on an
19+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20+
* KIND, either express or implied. See the License for the
21+
* specific language governing permissions and limitations
22+
* under the License.
23+
* #L%
24+
*/
25+
package co.elastic.logging;
26+
27+
/**
28+
* Logging frameworks differ in their implementation of log formatting.
29+
* For example JUL and Jboss only support formatting when the message is structured as follows: "Log: {0}"
30+
* whereas more recent log frameworks only support it with the following message: "Log: {}"
31+
* Log4j does not support parameterized logging.
32+
*/
33+
public enum ParameterizedLogSupport {
34+
BRACKETS_ONLY, // {}, {}
35+
NUMBER_AND_BRACKETS, // {0}, {1}
36+
NOT_SUPPORTED
37+
}

jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/EcsFormatterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void printStackTrace(PrintWriter pw) {
9090
}
9191
});
9292

93-
assertThat(formatter.format(record)).isEqualTo("{" +
93+
assertThat(formatter.format(record).replace("\\r\\n", "\\n")).isEqualTo("{" +
9494
"\"@timestamp\":\"1970-01-01T00:00:00.005Z\", " +
9595
"\"log.level\": \"INFO\", " +
9696
"\"message\":\"Example Message\", " +

jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package co.elastic.logging.jboss.logmanager;
2626

2727
import co.elastic.logging.AbstractEcsLoggingTest;
28+
import co.elastic.logging.ParameterizedLogSupport;
2829
import com.fasterxml.jackson.databind.JsonNode;
2930
import org.jboss.logmanager.Level;
3031
import org.jboss.logmanager.Logger;
@@ -64,6 +65,16 @@ public void debug(String message) {
6465
logger.log(Level.DEBUG, message);
6566
}
6667

68+
@Override
69+
public ParameterizedLogSupport getParameterizedLogSettings() {
70+
return ParameterizedLogSupport.NUMBER_AND_BRACKETS;
71+
}
72+
73+
@Override
74+
public void debug(String message, Object... logParams) {
75+
logger.log(Level.DEBUG, message, logParams);
76+
}
77+
6778
@Override
6879
public void error(String message, Throwable t) {
6980
logger.log(Level.ERROR, message, t);

jul-ecs-formatter/src/main/java/co/elastic/logging/jul/EcsFormatter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public String format(final LogRecord record) {
5656
final StringBuilder builder = new StringBuilder();
5757
EcsJsonSerializer.serializeObjectStart(builder, record.getMillis());
5858
EcsJsonSerializer.serializeLogLevel(builder, record.getLevel().getName());
59-
EcsJsonSerializer.serializeFormattedMessage(builder, record.getMessage());
59+
EcsJsonSerializer.serializeFormattedMessage(builder, super.formatMessage(record));
6060
EcsJsonSerializer.serializeServiceName(builder, serviceName);
6161
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
6262
EcsJsonSerializer.serializeThreadId(builder, record.getThreadID());

jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.stream.Collectors;
4242
import java.util.stream.StreamSupport;
4343

44+
import co.elastic.logging.ParameterizedLogSupport;
4445
import org.junit.jupiter.api.BeforeEach;
4546
import org.junit.jupiter.api.Test;
4647

@@ -85,6 +86,16 @@ public void debug(String message) {
8586
logger.log(Level.FINE, message);
8687
}
8788

89+
@Override
90+
public ParameterizedLogSupport getParameterizedLogSettings() {
91+
return ParameterizedLogSupport.NUMBER_AND_BRACKETS;
92+
}
93+
94+
@Override
95+
public void debug(String message, Object... logParams) {
96+
logger.log(Level.FINE, message, logParams);
97+
}
98+
8899
@Override
89100
public void error(String message, Throwable t) {
90101
logger.log(Level.SEVERE, message, t);

log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,9 @@
2525
package co.elastic.logging.log4j;
2626

2727
import co.elastic.logging.AbstractEcsLoggingTest;
28+
import co.elastic.logging.ParameterizedLogSupport;
2829
import com.fasterxml.jackson.databind.JsonNode;
29-
import org.apache.log4j.LogManager;
30-
import org.apache.log4j.Logger;
31-
import org.apache.log4j.MDC;
32-
import org.apache.log4j.NDC;
30+
import org.apache.log4j.*;
3331
import org.junit.jupiter.api.AfterEach;
3432
import org.junit.jupiter.api.Assumptions;
3533
import org.junit.jupiter.api.BeforeEach;
@@ -82,6 +80,16 @@ public void debug(String message) {
8280
logger.debug(message);
8381
}
8482

83+
@Override
84+
public ParameterizedLogSupport getParameterizedLogSettings() {
85+
return ParameterizedLogSupport.NOT_SUPPORTED;
86+
}
87+
88+
@Override
89+
public void debug(String message, Object... logParams) {
90+
throw new UnsupportedOperationException();
91+
}
92+
8593
@Override
8694
public void error(String message, Throwable t) {
8795
logger.error(message, t);

log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ public void debug(String message) {
194194
root.debug(message);
195195
}
196196

197+
@Override
198+
public void debug(String message, Object... logParams) {
199+
root.debug(message, logParams);
200+
}
201+
197202
@Override
198203
public void error(String message, Throwable t) {
199204
root.error(message, t);

logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public void debug(String message) {
4848
logger.debug(message);
4949
}
5050

51+
@Override
52+
public void debug(String message, Object... logParams) {
53+
logger.debug(message, logParams);
54+
}
55+
5156
@Test
5257
void testAdditionalFields() throws Exception {
5358
debug("test");

0 commit comments

Comments
 (0)