You're missing a @Required on the mandatory field(s) (or a null check in the build method).
---------- Forwarded message ---------- From: <mi...@apache.org> Date: 3 January 2017 at 15:09 Subject: logging-log4j2 git commit: LOG4J-1762 Add Builder to GelfLayout To: comm...@logging.apache.org Repository: logging-log4j2 Updated Branches: refs/heads/master ce3bd9a59 -> 014300908 LOG4J-1762 Add Builder to GelfLayout Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ commit/01430090 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/01430090 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/01430090 Branch: refs/heads/master Commit: 0143009081516481e587a3a90e83beee7fff9f18 Parents: ce3bd9a Author: Mikael Ståldal <mikael.stal...@magine.com> Authored: Tue Jan 3 22:09:22 2017 +0100 Committer: Mikael Ståldal <mikael.stal...@magine.com> Committed: Tue Jan 3 22:09:22 2017 +0100 ---------------------------------------------------------------------- .../logging/log4j/core/layout/GelfLayout.java | 132 ++++++++++++++++++- .../log4j/core/layout/GelfLayoutTest.java | 10 +- .../log4j/core/layout/GelfLayoutTest2.java | 48 +++++++ .../src/test/resources/GelfLayoutTest2.xml | 33 +++++ .../log4j/perf/jmh/GelfLayoutBenchmark.java | 13 +- src/site/xdoc/manual/layouts.xml.vm | 2 +- 6 files changed, 225 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ 01430090/log4j-core/src/main/java/org/apache/logging/log4j/ core/layout/GelfLayout.java ---------------------------------------------------------------------- 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 2f4853c..f7826d0 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 @@ -30,19 +30,21 @@ import java.util.zip.GZIPOutputStream; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.Node; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.net.Severity; import org.apache.logging.log4j.core.util.JsonUtils; import org.apache.logging.log4j.core.util.KeyValuePair; -import org.apache.logging.log4j.util.TriConsumer; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.status.StatusLogger; import org.apache.logging.log4j.util.StringBuilderFormattable; import org.apache.logging.log4j.util.Strings; +import org.apache.logging.log4j.util.TriConsumer; /** * Lays out events in the Graylog Extended Log Format (GELF) 1.1. @@ -107,6 +109,110 @@ public final class GelfLayout extends AbstractStringLayout { private final String host; private final boolean includeStacktrace; + public static class Builder<B extends Builder<B>> extends AbstractStringLayout.Builder<B> + implements org.apache.logging.log4j.core.util.Builder<GelfLayout> { + + @PluginBuilderAttribute + private String host; + + @PluginElement("AdditionalField") + private KeyValuePair[] additionalFields; + + @PluginBuilderAttribute + private CompressionType compressionType = CompressionType.GZIP; + + @PluginBuilderAttribute + private int compressionThreshold = COMPRESSION_THRESHOLD; + + @PluginBuilderAttribute + private boolean includeStacktrace = true; + + public Builder() { + super(); + setCharset(StandardCharsets.UTF_8); + } + + @Override + public GelfLayout build() { + return new GelfLayout(getConfiguration(), host, additionalFields, compressionType, compressionThreshold, includeStacktrace); + } + + public String getHost() { + return host; + } + + public CompressionType getCompressionType() { + return compressionType; + } + + public int getCompressionThreshold() { + return compressionThreshold; + } + + public boolean isIncludeStacktrace() { + return includeStacktrace; + } + + public KeyValuePair[] getAdditionalFields() { + return additionalFields; + } + + /** + * The value of the <code>host</code> property (mandatory). + * + * @return this builder + */ + public B setHost(String host) { + this.host = host; + return asBuilder(); + } + + /** + * Compression to use (optional, defaults to GZIP). + * + * @return this builder + */ + public B setCompressionType(CompressionType compressionType) { + this.compressionType = compressionType; + return asBuilder(); + } + + /** + * Compress if data is larger than this number of bytes (optional, defaults to 1024). + * + * @return this builder + */ + public B setCompressionThreshold(int compressionThreshold) { + this.compressionThreshold = compressionThreshold; + return asBuilder(); + } + + /** + * Whether to include full stacktrace of logged Throwables (optional, default to true). + * If set to false, only the class name and message of the Throwable will be included. + * + * @return this builder + */ + public B setIncludeStacktrace(boolean includeStacktrace) { + this.includeStacktrace = includeStacktrace; + return asBuilder(); + } + + /** + * Additional fields to set on each log event. + * + * @return this builder + */ + public B setAdditionalFields(KeyValuePair[] additionalFields) { + this.additionalFields = additionalFields; + return asBuilder(); + } + } + + /** + * @deprecated Use {@link #newBuilder()} instead + */ + @Deprecated public GelfLayout(final String host, final KeyValuePair[] additionalFields, final CompressionType compressionType, final int compressionThreshold, final boolean includeStacktrace) { super(StandardCharsets.UTF_8); @@ -117,7 +223,20 @@ public final class GelfLayout extends AbstractStringLayout { this.includeStacktrace = includeStacktrace; } - @PluginFactory + private GelfLayout(final Configuration config, final String host, final KeyValuePair[] additionalFields, final CompressionType compressionType, + final int compressionThreshold, final boolean includeStacktrace) { + super(config, StandardCharsets.UTF_8, null, null); + this.host = host; + this.additionalFields = additionalFields; + this.compressionType = compressionType; + this.compressionThreshold = compressionThreshold; + this.includeStacktrace = includeStacktrace; + } + + /** + * @deprecated Use {@link #newBuilder()} instead + */ + @Deprecated public static GelfLayout createLayout( //@formatter:off @PluginAttribute("host") final String host, @@ -129,7 +248,12 @@ public final class GelfLayout extends AbstractStringLayout { @PluginAttribute(value = "includeStacktrace", defaultBoolean = true) final boolean includeStacktrace) { // @formatter:on - return new GelfLayout(host, additionalFields, compressionType, compressionThreshold, includeStacktrace); + return new GelfLayout(null, host, additionalFields, compressionType, compressionThreshold, includeStacktrace); + } + + @PluginBuilderFactory + public static <B extends Builder<B>> B newBuilder() { + return new Builder<B>().asBuilder(); } @Override http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ 01430090/log4j-core/src/test/java/org/apache/logging/log4j/ core/layout/GelfLayoutTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/ layout/GelfLayoutTest.java index 268d5d3..68d77f9 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/ layout/GelfLayoutTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ layout/GelfLayoutTest.java @@ -83,9 +83,15 @@ public class GelfLayoutTest { root.removeAppender(appender); } // set up appenders - final GelfLayout layout = GelfLayout.createLayout(HOSTNAME, new KeyValuePair[] { + final GelfLayout layout = GelfLayout.newBuilder() + .setHost(HOSTNAME) + .setAdditionalFields(new KeyValuePair[] { new KeyValuePair(KEY1, VALUE1), - new KeyValuePair(KEY2, VALUE2), }, compressionType, 1024, includeStacktrace); + new KeyValuePair(KEY2, VALUE2), }) + .setCompressionType(compressionType) + .setCompressionThreshold(1024) + .setIncludeStacktrace(includeStacktrace) + .build(); final ListAppender eventAppender = new ListAppender("Events", null, null, true, false); final ListAppender rawAppender = new ListAppender("Raw", null, layout, true, true); final ListAppender formattedAppender = new ListAppender("Formatted", null, layout, true, false); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ 01430090/log4j-core/src/test/java/org/apache/logging/log4j/ core/layout/GelfLayoutTest2.java ---------------------------------------------------------------------- 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/GelfLayoutTest2.java new file mode 100644 index 0000000..edbf7b1 --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ layout/GelfLayoutTest2.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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. + */ +package org.apache.logging.log4j.core.layout; + +import java.io.IOException; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.junit.ClassRule; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class GelfLayoutTest2 { + + @ClassRule + public static LoggerContextRule context = new LoggerContextRule(" GelfLayoutTest2.xml"); + + @Test + public void gelfLayout() throws IOException { + Logger logger = context.getLogger(); + logger.info("Message"); + String gelf = context.getListAppender("list").getMessages().get(0); + ObjectMapper mapper = new ObjectMapper(); + JsonNode json = mapper.readTree(gelf); + assertEquals("Message", json.get("short_message").asText()); + assertEquals("myhost", json.get("host").asText()); + assertEquals("FOO", json.get("_foo").asText()); + } + +} + http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ 01430090/log4j-core/src/test/resources/GelfLayoutTest2.xml ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/resources/GelfLayoutTest2.xml b/log4j-core/src/test/resources/GelfLayoutTest2.xml new file mode 100644 index 0000000..f501185 --- /dev/null +++ b/log4j-core/src/test/resources/GelfLayoutTest2.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF 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. + +--> +<Configuration status="OFF" name="GelfLayoutTest2"> + <Appenders> + <List name="list"> + <GelfLayout host="myhost"> + <KeyValuePair key="foo" value="FOO"/> + </GelfLayout> + </List> + </Appenders> + + <Loggers> + <Root level="info"> + <AppenderRef ref="list"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ 01430090/log4j-perf/src/main/java/org/apache/logging/log4j/ perf/jmh/GelfLayoutBenchmark.java ---------------------------------------------------------------------- diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/GelfLayoutBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/ jmh/GelfLayoutBenchmark.java index 041be85..9ab0fc2 100644 --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/ jmh/GelfLayoutBenchmark.java +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/ jmh/GelfLayoutBenchmark.java @@ -78,12 +78,13 @@ public class GelfLayoutBenchmark { public void setUp() { System.setProperty("log4j2.enable.direct.encoders", "true"); - appender = new DemoAppender(new GelfLayout( - "host", - ADDITIONAL_FIELDS, - GelfLayout.CompressionType.OFF, - 0, - true)); + appender = new DemoAppender(GelfLayout.newBuilder() + .setHost("host") + .setAdditionalFields(ADDITIONAL_FIELDS) + .setCompressionType(GelfLayout.CompressionType.OFF) + .setCompressionThreshold(0) + .setIncludeStacktrace(true) + .build()); j = 0; } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ 01430090/src/site/xdoc/manual/layouts.xml.vm ---------------------------------------------------------------------- diff --git a/src/site/xdoc/manual/layouts.xml.vm b/src/site/xdoc/manual/ layouts.xml.vm index 73517cb..ba0dc20 100644 --- a/src/site/xdoc/manual/layouts.xml.vm +++ b/src/site/xdoc/manual/layouts.xml.vm @@ -225,7 +225,7 @@ logger.debug("one={}, two={}, three={}", 1, 2, 3); <tr> <td>compressionThreshold</td> <td>int</td> - <td>compress if data is larger than this number of bytes (optional, defaults to 1024)</td> + <td>Compress if data is larger than this number of bytes (optional, defaults to 1024)</td> </tr> <tr> <td>includeStacktrace</td> -- Matt Sicker <boa...@gmail.com>