From bf03a33df230eb18740d85b7169204f6461dd63a Mon Sep 17 00:00:00 2001 From: Nick Wemekamp Date: Tue, 30 Jun 2020 15:00:50 +0200 Subject: [PATCH 1/4] Call the format message method from java util logging so that logging parameters get replaced with their actual values. --- .../src/main/java/co/elastic/logging/jul/EcsFormatter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jul-ecs-formatter/src/main/java/co/elastic/logging/jul/EcsFormatter.java b/jul-ecs-formatter/src/main/java/co/elastic/logging/jul/EcsFormatter.java index fa06af68..9964e834 100644 --- a/jul-ecs-formatter/src/main/java/co/elastic/logging/jul/EcsFormatter.java +++ b/jul-ecs-formatter/src/main/java/co/elastic/logging/jul/EcsFormatter.java @@ -56,7 +56,7 @@ public String format(final LogRecord record) { final StringBuilder builder = new StringBuilder(); EcsJsonSerializer.serializeObjectStart(builder, record.getMillis()); EcsJsonSerializer.serializeLogLevel(builder, record.getLevel().getName()); - EcsJsonSerializer.serializeFormattedMessage(builder, record.getMessage()); + EcsJsonSerializer.serializeFormattedMessage(builder, super.formatMessage(record)); EcsJsonSerializer.serializeServiceName(builder, serviceName); EcsJsonSerializer.serializeEventDataset(builder, eventDataset); EcsJsonSerializer.serializeThreadId(builder, record.getThreadID()); From 1791bef034408d8930bd9b48743956654cfb9972 Mon Sep 17 00:00:00 2001 From: Nick Wemekamp Date: Tue, 30 Jun 2020 15:03:03 +0200 Subject: [PATCH 2/4] replace actual value in unit test because the line endings are OS specific which caused the unit test to fail on windows. --- .../co/elastic/logging/jboss/logmanager/EcsFormatterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/EcsFormatterTest.java b/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/EcsFormatterTest.java index c923884b..642019f5 100644 --- a/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/EcsFormatterTest.java +++ b/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/EcsFormatterTest.java @@ -90,7 +90,7 @@ public void printStackTrace(PrintWriter pw) { } }); - assertThat(formatter.format(record)).isEqualTo("{" + + assertThat(formatter.format(record).replace("\\r\\n", "\\n")).isEqualTo("{" + "\"@timestamp\":\"1970-01-01T00:00:00.005Z\", " + "\"log.level\": \"INFO\", " + "\"message\":\"Example Message\", " + From 16ee41ac7b89904c5357eb39f6630da82de7c7ff Mon Sep 17 00:00:00 2001 From: Nick Wemekamp Date: Tue, 30 Jun 2020 15:05:26 +0200 Subject: [PATCH 3/4] added unit tests for parameterized logging --- .../logging/AbstractEcsLoggingTest.java | 24 ++++++++++++ .../logging/ParameterizedLogSupport.java | 37 +++++++++++++++++++ .../jboss/logmanager/JBossLogManagerTest.java | 11 ++++++ .../logging/jul/JulLoggingTestTest.java | 11 ++++++ .../logging/log4j/Log4jEcsLayoutTest.java | 16 ++++++-- .../log4j2/AbstractLog4j2EcsLayoutTest.java | 5 +++ .../logback/AbstractEcsEncoderTest.java | 5 +++ 7 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 ecs-logging-core/src/test/java/co/elastic/logging/ParameterizedLogSupport.java diff --git a/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java b/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java index e3046cde..e70d06d7 100644 --- a/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java +++ b/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java @@ -59,6 +59,24 @@ void testSimpleLog() throws Exception { assertThat(getLastLogLine().get("message").textValue()).isEqualTo("test"); } + @Test + void testSimpleParameterizedLog() throws Exception { + ParameterizedLogSupport parameterizedLogSupport = getParameterizedLogSettings(); + + // don't test parameterized logging if the log framework implementation does not support it. + if (parameterizedLogSupport == ParameterizedLogSupport.NOT_SUPPORTED) { + return; + } + + if (parameterizedLogSupport == ParameterizedLogSupport.NUMBER_AND_BRACKETS) { + debug("{0} is not {1}", new Object[]{1, 2}); + } else if (parameterizedLogSupport == ParameterizedLogSupport.BRACKETS_ONLY) { + debug("{} is not {}", new Object[]{1, 2}); + } + + assertThat(getLastLogLine().get("message").textValue()).isEqualTo("1 is not 2"); + } + @Test void testThreadContext() throws Exception { if (putMdc("foo", "bar")) { @@ -124,8 +142,14 @@ public boolean putNdc(String message) { return false; } + public ParameterizedLogSupport getParameterizedLogSettings() { + return ParameterizedLogSupport.BRACKETS_ONLY; + } + public abstract void debug(String message); + public abstract void debug(String message, Object[] logParams); + public abstract void error(String message, Throwable t); public abstract JsonNode getLastLogLine() throws IOException; diff --git a/ecs-logging-core/src/test/java/co/elastic/logging/ParameterizedLogSupport.java b/ecs-logging-core/src/test/java/co/elastic/logging/ParameterizedLogSupport.java new file mode 100644 index 00000000..d279bd57 --- /dev/null +++ b/ecs-logging-core/src/test/java/co/elastic/logging/ParameterizedLogSupport.java @@ -0,0 +1,37 @@ +/*- + * #%L + * Java ECS logging + * %% + * Copyright (C) 2019 - 2020 Elastic and contributors + * %% + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * #L% + */ +package co.elastic.logging; + +/** + * Logging frameworks differ in their implementation of log formatting. + * For example JUL and Jboss only support formatting when the message is structured as follows: "Log: {0}" + * whereas more recent log frameworks only support it with the following message: "Log: {}" + * Log4j does not support parameterized logging. + */ +public enum ParameterizedLogSupport { + BRACKETS_ONLY, // {}, {} + NUMBER_AND_BRACKETS, // {0}, {1} + NOT_SUPPORTED +} diff --git a/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java b/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java index 24fe0bad..e7c62e24 100644 --- a/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java +++ b/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java @@ -25,6 +25,7 @@ package co.elastic.logging.jboss.logmanager; import co.elastic.logging.AbstractEcsLoggingTest; +import co.elastic.logging.ParameterizedLogSupport; import com.fasterxml.jackson.databind.JsonNode; import org.jboss.logmanager.Level; import org.jboss.logmanager.Logger; @@ -64,6 +65,16 @@ public void debug(String message) { logger.log(Level.DEBUG, message); } + @Override + public ParameterizedLogSupport getParameterizedLogSettings() { + return ParameterizedLogSupport.NUMBER_AND_BRACKETS; + } + + @Override + public void debug(String message, Object[] logParams) { + logger.log(Level.DEBUG, message, logParams); + } + @Override public void error(String message, Throwable t) { logger.log(Level.ERROR, message, t); diff --git a/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java b/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java index 63fef0bc..13b00d6d 100644 --- a/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java +++ b/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java @@ -41,6 +41,7 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import co.elastic.logging.ParameterizedLogSupport; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -85,6 +86,16 @@ public void debug(String message) { logger.log(Level.FINE, message); } + @Override + public ParameterizedLogSupport getParameterizedLogSettings() { + return ParameterizedLogSupport.NUMBER_AND_BRACKETS; + } + + @Override + public void debug(String message, Object[] logParams) { + logger.log(Level.FINE, message, logParams); + } + @Override public void error(String message, Throwable t) { logger.log(Level.SEVERE, message, t); diff --git a/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java b/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java index 002fc0b8..b1313583 100644 --- a/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java +++ b/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java @@ -25,11 +25,9 @@ package co.elastic.logging.log4j; import co.elastic.logging.AbstractEcsLoggingTest; +import co.elastic.logging.ParameterizedLogSupport; import com.fasterxml.jackson.databind.JsonNode; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.apache.log4j.MDC; -import org.apache.log4j.NDC; +import org.apache.log4j.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeEach; @@ -82,6 +80,16 @@ public void debug(String message) { logger.debug(message); } + @Override + public ParameterizedLogSupport getParameterizedLogSettings() { + return ParameterizedLogSupport.NOT_SUPPORTED; + } + + @Override + public void debug(String message, Object[] logParams) { + throw new UnsupportedOperationException(); + } + @Override public void error(String message, Throwable t) { logger.error(message, t); diff --git a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java index f8f8c851..57ef44d5 100644 --- a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java +++ b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java @@ -194,6 +194,11 @@ public void debug(String message) { root.debug(message); } + @Override + public void debug(String message, Object[] logParams) { + root.debug(message, logParams); + } + @Override public void error(String message, Throwable t) { root.error(message, t); diff --git a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java index 63fd1bba..7cb4bcaf 100644 --- a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java +++ b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java @@ -48,6 +48,11 @@ public void debug(String message) { logger.debug(message); } + @Override + public void debug(String message, Object[] logParams) { + logger.debug(message, logParams); + } + @Test void testAdditionalFields() throws Exception { debug("test"); From 9c6ee2658336469c9a72ecc92be305f8ab7f572d Mon Sep 17 00:00:00 2001 From: Nick Wemekamp Date: Wed, 1 Jul 2020 13:20:03 +0200 Subject: [PATCH 4/4] Changed the Object[] param in unit test to varargs. --- .../java/co/elastic/logging/AbstractEcsLoggingTest.java | 6 +++--- .../logging/jboss/logmanager/JBossLogManagerTest.java | 2 +- .../java/co/elastic/logging/jul/JulLoggingTestTest.java | 2 +- .../java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java | 2 +- .../elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java | 2 +- .../co/elastic/logging/logback/AbstractEcsEncoderTest.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java b/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java index e70d06d7..ba2cdeb5 100644 --- a/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java +++ b/ecs-logging-core/src/test/java/co/elastic/logging/AbstractEcsLoggingTest.java @@ -69,9 +69,9 @@ void testSimpleParameterizedLog() throws Exception { } if (parameterizedLogSupport == ParameterizedLogSupport.NUMBER_AND_BRACKETS) { - debug("{0} is not {1}", new Object[]{1, 2}); + debug("{0} is not {1}", 1, 2); } else if (parameterizedLogSupport == ParameterizedLogSupport.BRACKETS_ONLY) { - debug("{} is not {}", new Object[]{1, 2}); + debug("{} is not {}", 1, 2); } assertThat(getLastLogLine().get("message").textValue()).isEqualTo("1 is not 2"); @@ -148,7 +148,7 @@ public ParameterizedLogSupport getParameterizedLogSettings() { public abstract void debug(String message); - public abstract void debug(String message, Object[] logParams); + public abstract void debug(String message, Object... logParams); public abstract void error(String message, Throwable t); diff --git a/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java b/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java index e7c62e24..ff089964 100644 --- a/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java +++ b/jboss-logmanager-ecs-formatter/src/test/java/co/elastic/logging/jboss/logmanager/JBossLogManagerTest.java @@ -71,7 +71,7 @@ public ParameterizedLogSupport getParameterizedLogSettings() { } @Override - public void debug(String message, Object[] logParams) { + public void debug(String message, Object... logParams) { logger.log(Level.DEBUG, message, logParams); } diff --git a/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java b/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java index 13b00d6d..41a6ff4b 100644 --- a/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java +++ b/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTestTest.java @@ -92,7 +92,7 @@ public ParameterizedLogSupport getParameterizedLogSettings() { } @Override - public void debug(String message, Object[] logParams) { + public void debug(String message, Object... logParams) { logger.log(Level.FINE, message, logParams); } diff --git a/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java b/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java index b1313583..db8d35f3 100644 --- a/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java +++ b/log4j-ecs-layout/src/test/java/co/elastic/logging/log4j/Log4jEcsLayoutTest.java @@ -86,7 +86,7 @@ public ParameterizedLogSupport getParameterizedLogSettings() { } @Override - public void debug(String message, Object[] logParams) { + public void debug(String message, Object... logParams) { throw new UnsupportedOperationException(); } diff --git a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java index 57ef44d5..7182512e 100644 --- a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java +++ b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/AbstractLog4j2EcsLayoutTest.java @@ -195,7 +195,7 @@ public void debug(String message) { } @Override - public void debug(String message, Object[] logParams) { + public void debug(String message, Object... logParams) { root.debug(message, logParams); } diff --git a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java index 7cb4bcaf..5c21a246 100644 --- a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java +++ b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/AbstractEcsEncoderTest.java @@ -49,7 +49,7 @@ public void debug(String message) { } @Override - public void debug(String message, Object[] logParams) { + public void debug(String message, Object... logParams) { logger.debug(message, logParams); }