diff --git a/docs/tab-widgets/ecs-encoder.asciidoc b/docs/tab-widgets/ecs-encoder.asciidoc
index 8d538cfb..10132aad 100644
--- a/docs/tab-widgets/ecs-encoder.asciidoc
+++ b/docs/tab-widgets/ecs-encoder.asciidoc
@@ -41,6 +41,7 @@ All you have to do is to use the `co.elastic.logging.logback.EcsEncoder` instead
----
my-application
+ my-application-version
my-application-cluster-node
----
@@ -53,7 +54,12 @@ All you have to do is to use the `co.elastic.logging.logback.EcsEncoder` instead
|`serviceName`
|String
|
-|Sets the `service.name` field so you can filter your logs by a particular service
+|Sets the `service.name` field so you can filter your logs by a particular service name
+
+|`serviceVersion`
+|String
+|
+|Sets the `service.version` field so you can filter your logs by a particular service version
|`serviceNodeName`
|String
@@ -110,10 +116,10 @@ For example:
-
+
-
+
@@ -133,7 +139,12 @@ For example:
|`serviceName`
|String
|
-|Sets the `service.name` field so you can filter your logs by a particular service
+|Sets the `service.name` field so you can filter your logs by a particular service name
+
+|`serviceVersion`
+|String
+|
+|Sets the `service.version` field so you can filter your logs by a particular service version
|`serviceNodeName`
|String
@@ -220,7 +231,12 @@ For example:
|`serviceName`
|String
|
-|Sets the `service.name` field so you can filter your logs by a particular service
+|Sets the `service.name` field so you can filter your logs by a particular service name
+
+|`serviceVersion`
+|String
+|
+|Sets the `service.version` field so you can filter your logs by a particular service version
|`serviceNodeName`
|String
@@ -269,6 +285,7 @@ For example, in `$CATALINA_HOME/conf/logging.properties`:
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = co.elastic.logging.jul.EcsFormatter
co.elastic.logging.jul.EcsFormatter.serviceName=my-app
+co.elastic.logging.jul.EcsFormatter.serviceVersion=my-app-version
co.elastic.logging.jul.EcsFormatter.serviceNodeName=my-app-cluster-node
----
@@ -280,7 +297,12 @@ co.elastic.logging.jul.EcsFormatter.serviceNodeName=my-app-cluster-node
|`serviceName`
|String
|
-|Sets the `service.name` field so you can filter your logs by a particular service
+|Sets the `service.name` field so you can filter your logs by a particular service name
+
+|`serviceVersion`
+|String
+|
+|Sets the `service.version` field so you can filter your logs by a particular service version
|`serviceNodeName`
|String
@@ -328,7 +350,7 @@ Add the formatter to a handler in the logging subsystem:
[source,bash]
----
$WILDFLY_HOME/bin/jboss-cli.sh -c '/subsystem=logging/custom-formatter=ECS:add(module=co.elastic.logging.jboss-logmanager-ecs-formatter,
-class=co.elastic.logging.jboss.logmanager.EcsFormatter, properties={serviceName=my-app,serviceNodeName=my-app-cluster-node}),\
+class=co.elastic.logging.jboss.logmanager.EcsFormatter, properties={serviceName=my-app,serviceVersion=my-app-version,serviceNodeName=my-app-cluster-node}),\
/subsystem=logging/console-handler=CONSOLE:write-attribute(name=named-formatter,value=ECS)'
----
@@ -340,7 +362,12 @@ class=co.elastic.logging.jboss.logmanager.EcsFormatter, properties={serviceName=
|`serviceName`
|String
|
-|Sets the `service.name` field so you can filter your logs by a particular service
+|Sets the `service.name` field so you can filter your logs by a particular service name
+
+|`serviceVersion`
+|String
+|
+|Sets the `service.version` field so you can filter your logs by a particular service version
|`serviceNodeName`
|String
diff --git a/ecs-logging-core/src/main/java/co/elastic/logging/EcsJsonSerializer.java b/ecs-logging-core/src/main/java/co/elastic/logging/EcsJsonSerializer.java
index 8492e629..748592e8 100644
--- a/ecs-logging-core/src/main/java/co/elastic/logging/EcsJsonSerializer.java
+++ b/ecs-logging-core/src/main/java/co/elastic/logging/EcsJsonSerializer.java
@@ -95,6 +95,14 @@ public static void serializeServiceName(StringBuilder builder, String serviceNam
}
}
+ public static void serializeServiceVersion(StringBuilder builder, String serviceVersion) {
+ if (serviceVersion != null) {
+ builder.append("\"service.version\":\"");
+ JsonUtils.quoteAsString(serviceVersion, builder);
+ builder.append("\",");
+ }
+ }
+
public static void serializeServiceNodeName(StringBuilder builder, String serviceNodeName) {
if (serviceNodeName != null) {
builder.append("\"service.node.name\":\"");
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 671acc3d..4df38f01 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,7 @@ void testMetadata() throws Exception {
System.out.println(logLine.toPrettyString());
assertThat(logLine.get("process.thread.name").textValue()).isEqualTo(Thread.currentThread().getName());
assertThat(logLine.get("service.name").textValue()).isEqualTo("test");
+ assertThat(logLine.get("service.version").textValue()).isEqualTo("test-version");
assertThat(logLine.get("service.node.name").textValue()).isEqualTo("test-node");
assertThat(Instant.parse(logLine.get("@timestamp").textValue())).isCloseTo(Instant.now(), within(1, ChronoUnit.MINUTES));
assertThat(logLine.get("log.level").textValue()).isIn("DEBUG", "FINE");
diff --git a/ecs-logging-core/src/test/java/co/elastic/logging/EcsJsonSerializerTest.java b/ecs-logging-core/src/test/java/co/elastic/logging/EcsJsonSerializerTest.java
index 0b96a38e..e58a4f0c 100644
--- a/ecs-logging-core/src/test/java/co/elastic/logging/EcsJsonSerializerTest.java
+++ b/ecs-logging-core/src/test/java/co/elastic/logging/EcsJsonSerializerTest.java
@@ -65,6 +65,7 @@ void serializeExceptionAsString() throws IOException {
void testEscaping() throws IOException {
String loggerName = "logger\"";
String serviceName = "test\"";
+ String serviceVersion = "test-version\"";
String serviceNodeName = "test-node\"";
String eventDataset = "event-dataset\"";
String threadName = "event-dataset\"";
@@ -75,6 +76,7 @@ void testEscaping() throws IOException {
jsonBuilder.append('{');
EcsJsonSerializer.serializeLoggerName(jsonBuilder, loggerName);
EcsJsonSerializer.serializeServiceName(jsonBuilder, serviceName);
+ EcsJsonSerializer.serializeServiceVersion(jsonBuilder, serviceVersion);
EcsJsonSerializer.serializeServiceNodeName(jsonBuilder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(jsonBuilder, eventDataset);
EcsJsonSerializer.serializeThreadName(jsonBuilder, threadName);
@@ -85,6 +87,7 @@ void testEscaping() throws IOException {
assertThat(jsonNode.get("log.logger").textValue()).isEqualTo(loggerName);
assertThat(jsonNode.get("service.name").textValue()).isEqualTo(serviceName);
+ assertThat(jsonNode.get("service.version").textValue()).isEqualTo(serviceVersion);
assertThat(jsonNode.get("service.node.name").textValue()).isEqualTo(serviceNodeName);
assertThat(jsonNode.get("event.dataset").textValue()).isEqualTo(eventDataset);
assertThat(jsonNode.get("process.thread.name").textValue()).isEqualTo(eventDataset);
diff --git a/jboss-logmanager-ecs-formatter/src/main/java/co/elastic/logging/jboss/logmanager/EcsFormatter.java b/jboss-logmanager-ecs-formatter/src/main/java/co/elastic/logging/jboss/logmanager/EcsFormatter.java
index fbb1497a..99883cb8 100644
--- a/jboss-logmanager-ecs-formatter/src/main/java/co/elastic/logging/jboss/logmanager/EcsFormatter.java
+++ b/jboss-logmanager-ecs-formatter/src/main/java/co/elastic/logging/jboss/logmanager/EcsFormatter.java
@@ -24,19 +24,19 @@
*/
package co.elastic.logging.jboss.logmanager;
-import co.elastic.logging.EcsJsonSerializer;
import co.elastic.logging.AdditionalField;
+import co.elastic.logging.EcsJsonSerializer;
import org.jboss.logmanager.ExtFormatter;
import org.jboss.logmanager.ExtLogRecord;
import org.jboss.logmanager.LogManager;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class EcsFormatter extends ExtFormatter {
private String serviceName;
+ private String serviceVersion;
private String serviceNodeName;
private String eventDataset;
private List additionalFields = Collections.emptyList();
@@ -45,6 +45,7 @@ public class EcsFormatter extends ExtFormatter {
public EcsFormatter() {
serviceName = getProperty("co.elastic.logging.jboss.logmanager.EcsFormatter.serviceName", null);
+ serviceVersion = getProperty("co.elastic.logging.jboss.logmanager.EcsFormatter.serviceversion", null);
serviceNodeName = getProperty("co.elastic.logging.jboss.logmanager.EcsFormatter.serviceNodeName", null);
eventDataset = getProperty("co.elastic.logging.jboss.logmanager.EcsFormatter.eventDataset", null);
eventDataset = EcsJsonSerializer.computeEventDataset(eventDataset, serviceName);
@@ -60,6 +61,7 @@ public String format(ExtLogRecord record) {
EcsJsonSerializer.serializeFormattedMessage(builder, record.getFormattedMessage());
EcsJsonSerializer.serializeEcsVersion(builder);
EcsJsonSerializer.serializeServiceName(builder, serviceName);
+ EcsJsonSerializer.serializeServiceVersion(builder, serviceVersion);
EcsJsonSerializer.serializeServiceNodeName(builder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
EcsJsonSerializer.serializeThreadName(builder, record.getThreadName());
@@ -94,6 +96,10 @@ public void setServiceName(final String serviceName) {
eventDataset = EcsJsonSerializer.computeEventDataset(eventDataset, serviceName);
}
+ public void setServiceVersion(final String serviceVersion) {
+ this.serviceVersion = serviceVersion;
+ }
+
public void setServiceNodeName(final String serviceNodeName) {
this.serviceNodeName = serviceNodeName;
}
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 22ed6255..a4584016 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
@@ -89,6 +89,7 @@ public JsonNode getLastLogLine() throws IOException {
void setUp() {
formatter.setIncludeOrigin(true);
formatter.setServiceName("test");
+ formatter.setServiceVersion("test-version");
formatter.setServiceNodeName("test-node");
formatter.setEventDataset("testdataset");
formatter.setAdditionalFields("key1=value1,key2=value2");
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 b318b7cb..f87dc445 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
@@ -40,6 +40,7 @@ public class EcsFormatter extends Formatter {
private boolean stackTraceAsArray;
private String serviceName;
+ private String serviceVersion;
private String serviceNodeName;
private boolean includeOrigin;
private String eventDataset;
@@ -50,6 +51,7 @@ public class EcsFormatter extends Formatter {
*/
public EcsFormatter() {
serviceName = getProperty("co.elastic.logging.jul.EcsFormatter.serviceName", null);
+ serviceVersion= getProperty("co.elastic.logging.jul.EcsFormatter.serviceVersion", null);
serviceNodeName = getProperty("co.elastic.logging.jul.EcsFormatter.serviceNodeName", null);
includeOrigin = Boolean.getBoolean(getProperty("co.elastic.logging.jul.EcsFormatter.includeOrigin", "false"));
stackTraceAsArray = Boolean
@@ -69,6 +71,7 @@ public String format(final LogRecord record) {
EcsJsonSerializer.serializeAdditionalFields(builder, additionalFields);
EcsJsonSerializer.serializeMDC(builder, mdcSupplier.getMDC());
EcsJsonSerializer.serializeServiceName(builder, serviceName);
+ EcsJsonSerializer.serializeServiceVersion(builder, serviceVersion);
EcsJsonSerializer.serializeServiceNodeName(builder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
if (Thread.currentThread().getId() == record.getThreadID()) {
@@ -96,6 +99,10 @@ public void setServiceName(final String serviceName) {
this.serviceName = serviceName;
}
+ public void setServiceVersion(final String serviceVersion) {
+ this.serviceVersion = serviceVersion;
+ }
+
public void setServiceNodeName(final String serviceNodeName) {
this.serviceNodeName = serviceNodeName;
}
diff --git a/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTest.java b/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTest.java
index 981d771a..84e5c0c3 100644
--- a/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTest.java
+++ b/jul-ecs-formatter/src/test/java/co/elastic/logging/jul/JulLoggingTest.java
@@ -120,6 +120,7 @@ private void setUpFormatter() {
formatter = new EcsFormatter();
formatter.setIncludeOrigin(true);
formatter.setServiceName("test");
+ formatter.setServiceVersion("test-version");
formatter.setServiceNodeName("test-node");
formatter.setEventDataset("testdataset");
diff --git a/log4j-ecs-layout/src/main/java/co/elastic/logging/log4j/EcsLayout.java b/log4j-ecs-layout/src/main/java/co/elastic/logging/log4j/EcsLayout.java
index a97892fa..d8503048 100644
--- a/log4j-ecs-layout/src/main/java/co/elastic/logging/log4j/EcsLayout.java
+++ b/log4j-ecs-layout/src/main/java/co/elastic/logging/log4j/EcsLayout.java
@@ -40,6 +40,7 @@ public class EcsLayout extends Layout {
private boolean stackTraceAsArray = false;
private String serviceName;
+ private String serviceVersion;
private String serviceNodeName;
private boolean includeOrigin;
private String eventDataset;
@@ -53,6 +54,7 @@ public String format(LoggingEvent event) {
EcsJsonSerializer.serializeFormattedMessage(builder, event.getRenderedMessage());
EcsJsonSerializer.serializeEcsVersion(builder);
EcsJsonSerializer.serializeServiceName(builder, serviceName);
+ EcsJsonSerializer.serializeServiceVersion(builder, serviceVersion);
EcsJsonSerializer.serializeServiceNodeName(builder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
EcsJsonSerializer.serializeThreadName(builder, event.getThreadName());
@@ -101,6 +103,10 @@ public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
+ public void setServiceVersion(String serviceVersion) {
+ this.serviceVersion = serviceVersion;
+ }
+
public void setServiceNodeName(String serviceNodeName) {
this.serviceNodeName = serviceNodeName;
}
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 7ff39648..1ac395f0 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
@@ -51,6 +51,7 @@ void setUp() {
logger.addAppender(appender);
ecsLayout = new EcsLayout();
ecsLayout.setServiceName("test");
+ ecsLayout.setServiceVersion("test-version");
ecsLayout.setServiceNodeName("test-node");
ecsLayout.setIncludeOrigin(true);
ecsLayout.setEventDataset("testdataset");
diff --git a/log4j-ecs-layout/src/test/resources/log4j.xml b/log4j-ecs-layout/src/test/resources/log4j.xml
index f532306c..53287289 100644
--- a/log4j-ecs-layout/src/test/resources/log4j.xml
+++ b/log4j-ecs-layout/src/test/resources/log4j.xml
@@ -4,6 +4,7 @@
+
diff --git a/log4j2-ecs-layout/src/main/java/co/elastic/logging/log4j2/EcsLayout.java b/log4j2-ecs-layout/src/main/java/co/elastic/logging/log4j2/EcsLayout.java
index d4002baf..b3e0b203 100644
--- a/log4j2-ecs-layout/src/main/java/co/elastic/logging/log4j2/EcsLayout.java
+++ b/log4j2-ecs-layout/src/main/java/co/elastic/logging/log4j2/EcsLayout.java
@@ -71,6 +71,7 @@ public class EcsLayout extends AbstractStringLayout {
private final PatternFormatter[][] fieldValuePatternFormatter;
private final boolean stackTraceAsArray;
private final String serviceName;
+ private final String serviceVersion;
private final String serviceNodeName;
private final String eventDataset;
private final boolean includeMarkers;
@@ -78,10 +79,11 @@ public class EcsLayout extends AbstractStringLayout {
private final PatternFormatter[] exceptionPatternFormatter;
private final ConcurrentMap, Boolean> supportsJson = new ConcurrentHashMap, Boolean>();
- private EcsLayout(Configuration config, String serviceName, String serviceNodeName, String eventDataset, boolean includeMarkers,
+ private EcsLayout(Configuration config, String serviceName, String serviceVersion, String serviceNodeName, String eventDataset, boolean includeMarkers,
KeyValuePair[] additionalFields, boolean includeOrigin, String exceptionPattern, boolean stackTraceAsArray) {
super(config, UTF_8, null, null);
this.serviceName = serviceName;
+ this.serviceVersion = serviceVersion;
this.serviceNodeName = serviceNodeName;
this.eventDataset = eventDataset;
this.includeMarkers = includeMarkers;
@@ -140,6 +142,7 @@ private StringBuilder toText(LogEvent event, StringBuilder builder, boolean gcFr
serializeMessage(builder, gcFree, event.getMessage(), event.getThrown());
EcsJsonSerializer.serializeEcsVersion(builder);
EcsJsonSerializer.serializeServiceName(builder, serviceName);
+ EcsJsonSerializer.serializeServiceVersion(builder, serviceVersion);
EcsJsonSerializer.serializeServiceNodeName(builder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
EcsJsonSerializer.serializeThreadName(builder, event.getThreadName());
@@ -354,6 +357,8 @@ public static class Builder implements org.apache.logging.log4j.core.util.Builde
private Configuration configuration;
@PluginBuilderAttribute("serviceName")
private String serviceName;
+ @PluginBuilderAttribute("serviceVersion")
+ private String serviceVersion;
@PluginBuilderAttribute("serviceNodeName")
private String serviceNodeName;
@PluginBuilderAttribute("eventDataset")
@@ -389,6 +394,10 @@ public String getServiceName() {
return serviceName;
}
+ public String getServiceVersion() {
+ return serviceVersion;
+ }
+
public String getServiceNodeName() {
return serviceNodeName;
}
@@ -428,6 +437,11 @@ public EcsLayout.Builder setServiceName(final String serviceName) {
return this;
}
+ public EcsLayout.Builder setServiceVersion(final String serviceVersion) {
+ this.serviceVersion = serviceVersion;
+ return this;
+ }
+
public EcsLayout.Builder setServiceNodeName(final String serviceNodeName) {
this.serviceNodeName = serviceNodeName;
return this;
@@ -460,7 +474,7 @@ public EcsLayout.Builder setExceptionPattern(String exceptionPattern) {
@Override
public EcsLayout build() {
- return new EcsLayout(getConfiguration(), serviceName, serviceNodeName, EcsJsonSerializer.computeEventDataset(eventDataset, serviceName),
+ return new EcsLayout(getConfiguration(), serviceName, serviceVersion, serviceNodeName, EcsJsonSerializer.computeEventDataset(eventDataset, serviceName),
includeMarkers, additionalFields, includeOrigin, exceptionPattern, stackTraceAsArray);
}
}
diff --git a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/CustomExceptionPatternConverter.java b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/CustomExceptionPatternConverter.java
index 12be9222..7c291869 100644
--- a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/CustomExceptionPatternConverter.java
+++ b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/CustomExceptionPatternConverter.java
@@ -1,3 +1,27 @@
+/*-
+ * #%L
+ * Java ECS logging
+ * %%
+ * Copyright (C) 2019 - 2022 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.log4j2;
import org.apache.logging.log4j.core.LogEvent;
diff --git a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithExceptionPatternTest.java b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithExceptionPatternTest.java
index 72650d28..4c3502b7 100644
--- a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithExceptionPatternTest.java
+++ b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithExceptionPatternTest.java
@@ -1,3 +1,27 @@
+/*-
+ * #%L
+ * Java ECS logging
+ * %%
+ * Copyright (C) 2019 - 2022 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.log4j2;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithStackTraceAsArrayTest.java b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithStackTraceAsArrayTest.java
index 38c9218b..8eb7f4e2 100644
--- a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithStackTraceAsArrayTest.java
+++ b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/EcsLayoutWithStackTraceAsArrayTest.java
@@ -1,3 +1,27 @@
+/*-
+ * #%L
+ * Java ECS logging
+ * %%
+ * Copyright (C) 2019 - 2022 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.log4j2;
import com.fasterxml.jackson.databind.JsonNode;
diff --git a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/Log4j2EcsLayoutTest.java b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/Log4j2EcsLayoutTest.java
index 9b38820c..aba4f3ce 100644
--- a/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/Log4j2EcsLayoutTest.java
+++ b/log4j2-ecs-layout/src/test/java/co/elastic/logging/log4j2/Log4j2EcsLayoutTest.java
@@ -77,6 +77,7 @@ protected EcsLayout.Builder configureLayout(LoggerContext context) {
return EcsLayout.newBuilder()
.setConfiguration(context.getConfiguration())
.setServiceName("test")
+ .setServiceVersion("test-version")
.setServiceNodeName("test-node")
.setIncludeMarkers(true)
.setIncludeOrigin(true)
diff --git a/log4j2-ecs-layout/src/test/resources/log4j2-test.xml b/log4j2-ecs-layout/src/test/resources/log4j2-test.xml
index 3145d32c..e3397889 100644
--- a/log4j2-ecs-layout/src/test/resources/log4j2-test.xml
+++ b/log4j2-ecs-layout/src/test/resources/log4j2-test.xml
@@ -5,7 +5,7 @@
-
diff --git a/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java b/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java
index a35b3061..fb98bd77 100644
--- a/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java
+++ b/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java
@@ -46,6 +46,7 @@ public class EcsEncoder extends EncoderBase {
private static final Charset UTF_8 = Charset.forName("UTF-8");
private boolean stackTraceAsArray = false;
private String serviceName;
+ private String serviceVersion;
private String serviceNodeName;
private String eventDataset;
private boolean includeMarkers = false;
@@ -107,6 +108,7 @@ public byte[] encode(ILoggingEvent event) {
EcsJsonSerializer.serializeEcsVersion(builder);
serializeMarkers(event, builder);
EcsJsonSerializer.serializeServiceName(builder, serviceName);
+ EcsJsonSerializer.serializeServiceVersion(builder, serviceVersion);
EcsJsonSerializer.serializeServiceNodeName(builder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
EcsJsonSerializer.serializeThreadName(builder, event.getThreadName());
@@ -171,6 +173,10 @@ public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
+ public void setServiceVersion(String serviceVersion) {
+ this.serviceVersion = serviceVersion;
+ }
+
public void setServiceNodeName(String serviceNodeName) {
this.serviceNodeName = serviceNodeName;
}
diff --git a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderTest.java b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderTest.java
index 6e0352ba..d5d8f244 100644
--- a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderTest.java
+++ b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderTest.java
@@ -44,6 +44,7 @@ void setUp() {
logger.addAppender(appender);
EcsEncoder ecsEncoder = new EcsEncoder();
ecsEncoder.setServiceName("test");
+ ecsEncoder.setServiceVersion("test-version");
ecsEncoder.setServiceNodeName("test-node");
ecsEncoder.setIncludeMarkers(true);
ecsEncoder.setIncludeOrigin(true);
diff --git a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderWithStacktraceAsArrayTest.java b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderWithStacktraceAsArrayTest.java
index 01c53cbb..cf20e784 100644
--- a/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderWithStacktraceAsArrayTest.java
+++ b/logback-ecs-encoder/src/test/java/co/elastic/logging/logback/EcsEncoderWithStacktraceAsArrayTest.java
@@ -47,6 +47,7 @@ void setUp() throws IOException {
logger.addAppender(appender);
EcsEncoder ecsEncoder = new EcsEncoder();
ecsEncoder.setServiceName("test");
+ ecsEncoder.setServiceVersion("test-version");
ecsEncoder.setIncludeMarkers(true);
ecsEncoder.setIncludeOrigin(true);
ecsEncoder.addAdditionalField(new AdditionalField("key1", "value1"));
diff --git a/logback-ecs-encoder/src/test/resources/logback-config-with-nop-throwable-converter.xml b/logback-ecs-encoder/src/test/resources/logback-config-with-nop-throwable-converter.xml
index 96bb71b8..5005348d 100644
--- a/logback-ecs-encoder/src/test/resources/logback-config-with-nop-throwable-converter.xml
+++ b/logback-ecs-encoder/src/test/resources/logback-config-with-nop-throwable-converter.xml
@@ -4,6 +4,7 @@
test
+ test-version
test-node
true
true
diff --git a/logback-ecs-encoder/src/test/resources/logback-config.xml b/logback-ecs-encoder/src/test/resources/logback-config.xml
index c906211b..a0e8cb70 100644
--- a/logback-ecs-encoder/src/test/resources/logback-config.xml
+++ b/logback-ecs-encoder/src/test/resources/logback-config.xml
@@ -3,6 +3,7 @@
test
+ test-version
test-node
true
true