No fields are mandatory (any more). However, I added protection against additional fields being null.
What about configuration from AbstractLayout.Builder? On Jan 4, 2017 2:55 AM, "Matt Sicker" <boa...@gmail.com> wrote: > 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/0 > 1430090/log4j-core/src/main/java/org/apache/logging/log4j/co > re/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/lay > out/GelfLayout.java > index 2f4853c..f7826d0 100644 > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lay > out/GelfLayout.java > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lay > out/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.PluginBuilderAt > tribute; > +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/0 > 1430090/log4j-core/src/test/java/org/apache/logging/log4j/co > re/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/lay > out/GelfLayoutTest.java > index 268d5d3..68d77f9 100644 > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/lay > out/GelfLayoutTest.java > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay > out/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/0 > 1430090/log4j-core/src/test/java/org/apache/logging/log4j/co > re/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/lay > out/GelfLayoutTest2.java > new file mode 100644 > index 0000000..edbf7b1 > --- /dev/null > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lay > out/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/0 > 1430090/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/0 > 1430090/log4j-perf/src/main/java/org/apache/logging/log4j/pe > rf/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/0 > 1430090/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> >