This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new 5dcdd5d LOG4J2-3041 - Allow GelfLayout to use PatternSelectors
5dcdd5d is described below
commit 5dcdd5d84e0f2a174f01df92051d5a6fb84e701d
Author: Ralph Goers <[email protected]>
AuthorDate: Sat Mar 13 01:10:14 2021 -0700
LOG4J2-3041 - Allow GelfLayout to use PatternSelectors
---
.../logging/log4j/core/layout/GelfLayout.java | 24 ++++++++++++++
.../{GelfLayoutTest2.java => GelfLayout2Test.java} | 4 +--
.../{GelfLayoutTest3.java => GelfLayout3Test.java} | 6 ++--
...st3.java => GelfLayoutPatternSelectorTest.java} | 38 +++++++++++++++++-----
.../{GelfLayoutTest2.xml => GelfLayout2Test.xml} | 0
.../{GelfLayoutTest3.xml => GelfLayout3Test.xml} | 0
...Test3.xml => GelfLayoutPatternSelectorTest.xml} | 6 ++--
src/changes/changes.xml | 4 ++-
src/site/asciidoc/manual/layouts.adoc | 18 ++++++++--
9 files changed, 80 insertions(+), 20 deletions(-)
diff --git
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 14e71e1..38254f6 100644
---
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -144,6 +144,9 @@ public final class GelfLayout extends AbstractStringLayout {
@PluginBuilderAttribute
private String messagePattern = null;
+ @PluginElement("PatternSelector")
+ private PatternSelector patternSelector = null;
+
public Builder() {
super();
setCharset(StandardCharsets.UTF_8);
@@ -176,12 +179,23 @@ public final class GelfLayout extends
AbstractStringLayout {
checker = ListChecker.NOOP_CHECKER;
}
PatternLayout patternLayout = null;
+ if (messagePattern != null && patternSelector != null) {
+ LOGGER.error("A message pattern and PatternSelector cannot
both be specified on GelfLayout, "
+ + "ignoring message pattern");
+ messagePattern = null;
+ }
if (messagePattern != null) {
patternLayout =
PatternLayout.newBuilder().setPattern(messagePattern)
.setAlwaysWriteExceptions(includeStacktrace)
.setConfiguration(getConfiguration())
.build();
}
+ if (patternSelector != null) {
+ patternLayout =
PatternLayout.newBuilder().setPatternSelector(patternSelector)
+ .setAlwaysWriteExceptions(includeStacktrace)
+ .setConfiguration(getConfiguration())
+ .build();
+ }
return new GelfLayout(getConfiguration(), host, additionalFields,
compressionType, compressionThreshold,
includeStacktrace, includeThreadContext,
includeNullDelimiter, includeNewLineDelimiter, checker,
patternLayout);
@@ -310,6 +324,16 @@ public final class GelfLayout extends AbstractStringLayout
{
}
/**
+ * The PatternSelector to use to format the message.
+ * @param patternSelector the PatternSelector.
+ * @return this builder
+ */
+ public B setPatternSelector(final PatternSelector patternSelector) {
+ this.patternSelector = patternSelector;
+ return asBuilder();
+ }
+
+ /**
* A comma separated list of thread context keys to include;
* @param mdcIncludes the list of keys.
* @return this builder
diff --git
a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest2.java
b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayout2Test.java
similarity index 96%
rename from
log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest2.java
rename to
log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayout2Test.java
index 2b3f429..f9f44f7 100644
---
a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest2.java
+++
b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayout2Test.java
@@ -30,8 +30,8 @@ import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
-@LoggerContextSource("GelfLayoutTest2.xml")
-public class GelfLayoutTest2 {
+@LoggerContextSource("GelfLayout2Test.xml")
+public class GelfLayout2Test {
@Test
public void gelfLayout(final LoggerContext context, @Named final
ListAppender list) throws IOException {
diff --git
a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest3.java
b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayout3Test.java
similarity index 94%
copy from
log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest3.java
copy to
log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayout3Test.java
index fc9a404..6ebd27c 100644
---
a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest3.java
+++
b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayout3Test.java
@@ -32,10 +32,10 @@ import java.io.IOException;
import static org.junit.jupiter.api.Assertions.*;
-@LoggerContextSource("GelfLayoutTest3.xml")
+@LoggerContextSource("GelfLayout3Test.xml")
@UsingAnyThreadContext
@Tag("json")
-public class GelfLayoutTest3 {
+public class GelfLayout3Test {
@Test
public void gelfLayout(final LoggerContext context, @Named final
ListAppender list) throws IOException {
@@ -55,7 +55,7 @@ public class GelfLayoutTest3 {
assertNull(json.get("_requestId"));
String message = json.get("full_message").asText();
assertTrue(message.contains("loginId=rgoers"));
- assertTrue(message.contains("GelfLayoutTest3"));
+ assertTrue(message.contains("GelfLayout3Test"));
}
}
diff --git
a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest3.java
b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutPatternSelectorTest.java
similarity index 62%
rename from
log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest3.java
rename to
log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutPatternSelectorTest.java
index fc9a404..f3f5712 100644
---
a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest3.java
+++
b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutPatternSelectorTest.java
@@ -16,26 +16,32 @@
*/
package org.apache.logging.log4j.core.layout;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.junit.LoggerContextSource;
import org.apache.logging.log4j.junit.Named;
import org.apache.logging.log4j.junit.UsingAnyThreadContext;
+import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.test.appender.ListAppender;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
-import java.io.IOException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
-@LoggerContextSource("GelfLayoutTest3.xml")
+@LoggerContextSource("GelfLayoutPatternSelectorTest.xml")
@UsingAnyThreadContext
@Tag("json")
-public class GelfLayoutTest3 {
+public class GelfLayoutPatternSelectorTest {
@Test
public void gelfLayout(final LoggerContext context, @Named final
ListAppender list) throws IOException {
@@ -44,9 +50,10 @@ public class GelfLayoutTest3 {
ThreadContext.put("loginId", "rgoers");
ThreadContext.put("internalId", "12345");
logger.info("My Test Message");
- final String gelf = list.getMessages().get(0);
+ logger.info(AbstractLogger.FLOW_MARKER, "My Test Message");
+ String gelf = list.getMessages().get(0);
final ObjectMapper mapper = new ObjectMapper();
- final JsonNode json = mapper.readTree(gelf);
+ JsonNode json = mapper.readTree(gelf);
assertEquals("My Test Message", json.get("short_message").asText());
assertEquals("myhost", json.get("host").asText());
assertNotNull(json.get("_loginId"));
@@ -54,8 +61,21 @@ public class GelfLayoutTest3 {
assertNull(json.get("_internalId"));
assertNull(json.get("_requestId"));
String message = json.get("full_message").asText();
+ assertFalse(message.contains("====="));
+ assertTrue(message.contains("loginId=rgoers"));
+ assertTrue(message.contains("GelfLayoutPatternSelectorTest"));
+ gelf = list.getMessages().get(1);
+ json = mapper.readTree(gelf);
+ assertEquals("My Test Message", json.get("short_message").asText());
+ assertEquals("myhost", json.get("host").asText());
+ assertNotNull(json.get("_loginId"));
+ assertEquals("rgoers", json.get("_loginId").asText());
+ assertNull(json.get("_internalId"));
+ assertNull(json.get("_requestId"));
+ message = json.get("full_message").asText();
+ assertTrue(message.contains("====="));
assertTrue(message.contains("loginId=rgoers"));
- assertTrue(message.contains("GelfLayoutTest3"));
+ assertTrue(message.contains("GelfLayoutPatternSelectorTest"));
}
}
diff --git a/log4j-core/src/test/resources/GelfLayoutTest2.xml
b/log4j-core/src/test/resources/GelfLayout2Test.xml
similarity index 100%
rename from log4j-core/src/test/resources/GelfLayoutTest2.xml
rename to log4j-core/src/test/resources/GelfLayout2Test.xml
diff --git a/log4j-core/src/test/resources/GelfLayoutTest3.xml
b/log4j-core/src/test/resources/GelfLayout3Test.xml
similarity index 100%
copy from log4j-core/src/test/resources/GelfLayoutTest3.xml
copy to log4j-core/src/test/resources/GelfLayout3Test.xml
diff --git a/log4j-core/src/test/resources/GelfLayoutTest3.xml
b/log4j-core/src/test/resources/GelfLayoutPatternSelectorTest.xml
similarity index 78%
rename from log4j-core/src/test/resources/GelfLayoutTest3.xml
rename to log4j-core/src/test/resources/GelfLayoutPatternSelectorTest.xml
index fcb23d3..7fe50f6 100644
--- a/log4j-core/src/test/resources/GelfLayoutTest3.xml
+++ b/log4j-core/src/test/resources/GelfLayoutPatternSelectorTest.xml
@@ -16,11 +16,13 @@
limitations under the License.
-->
-<Configuration status="WARN" name="GelfLayoutTest3">
+<Configuration status="WARN" name="GelfLayoutPatternSelectorTest">
<Appenders>
<List name="list">
<GelfLayout host="myhost" includeThreadContext="true"
threadContextIncludes="requestId,loginId">
- <MessagePattern>%d [%t] %-5p %X{requestId, loginId} %C{1.}.%M:%L -
%m%n"</MessagePattern>
+ <MarkerPatternSelector defaultPattern="%d [%t] %-5p %X{requestId,
loginId} %C{1.}.%M:%L - %m%n">
+ <PatternMatch key="FLOW" pattern="[%-5level] %X{requestId, loginId}
====== %C{1.}.%M:%L %msg ======%n"/>
+ </MarkerPatternSelector>
<KeyValuePair key="foo" value="FOO"/>
<KeyValuePair key="runtime" value="$${java:runtime}"/>
</GelfLayout>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f4fb31d..3a01186 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -169,7 +169,9 @@
</action>
</release>
<release version="2.15.0" date="2021-MM-DD" description="GA Release
2.15.0">
-
+ <action issue="LOG4J2-3041" dev="rgoers" type="update">
+ Allow a PatternSelector to be specified on GelfLayout.
+ </action>
</release>
<release version="2.14.1" date="2021-03-06" description="GA Release
2.14.1">
<!-- FIXES -->
diff --git a/src/site/asciidoc/manual/layouts.adoc
b/src/site/asciidoc/manual/layouts.adoc
index 44d2580..0ac0d78 100644
--- a/src/site/asciidoc/manual/layouts.adoc
+++ b/src/site/asciidoc/manual/layouts.adoc
@@ -228,9 +228,20 @@ Useful for Graylog GELF TCP input. Cannot be used with
compression.
|messagePattern
|String
-|The pattern to use to format the String. If not supplied only the text
derived from the logging
-message will be used. See <<PatternLayout>> for information on the pattern
-strings
+|The pattern to use to format the String. A messagePattern and patternSelector
cannot both be
+specified. If both are present the message pattern will be ignored and an
error will be logged.
+If not supplied only the text derived from the logging message will be used.
See
+link:#PatternLayout[PatternLayout] for information on the pattern strings.
+
+|patternSelector
+|PatternSelector
+|The PatternSelector to use to format the String. A messagePattern and
patternSelector cannot both be
+specified. If both are present the message pattern will be ignored and an
error will be logged.
+If not supplied only the text derived from the logging message will be used.
+See link:#PatternSelectors[Pattern Selectors] for information on how to
specify a
+PatternSelector.
+See link:#PatternLayout[PatternLayout] for information on the pattern strings.
+
|threadContextExcludes
|String
@@ -1785,6 +1796,7 @@ All the content that follows the level will be bright
green.
</PatternLayout>
----
+[#PatternSelectors]
=== Pattern Selectors
The PatternLayout can be configured with a PatternSelector to allow it