What do you mean? On 7 January 2017 at 15:03, Mikael Ståldal <mikael.stal...@magine.com> wrote:
> 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.PluginBuilderFa >> ctory; >> 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> >> > -- Matt Sicker <boa...@gmail.com>