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..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 @@ -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}", 1, 2); + } else if (parameterizedLogSupport == ParameterizedLogSupport.BRACKETS_ONLY) { + debug("{} is not {}", 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/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\", " + 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..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 @@ -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/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()); 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..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 @@ -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..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 @@ -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..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 @@ -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..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 @@ -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");