LOG4J2-1860 Shortcut to add Property and KeyValuePair component in ConfigurationBuilder
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/df1b3e88 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/df1b3e88 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/df1b3e88 Branch: refs/heads/java9NoMultiRelease Commit: df1b3e8846246988d6119f65e7fcb3e5a9a3f1cb Parents: 1c99c7b Author: Mikael Ståldal <[email protected]> Authored: Wed Apr 5 18:03:27 2017 +0200 Committer: Mikael Ståldal <[email protected]> Committed: Wed Apr 5 18:03:27 2017 +0200 ---------------------------------------------------------------------- .../builder/api/ConfigurationBuilder.java | 15 +++++++++ .../api/KeyValuePairComponentBuilder.java | 25 ++++++++++++++ .../builder/api/PropertyComponentBuilder.java | 25 ++++++++++++++ .../impl/DefaultConfigurationBuilder.java | 11 +++++++ .../DefaultKeyValuePairComponentBuilder.java | 34 ++++++++++++++++++++ .../impl/DefaultPropertyComponentBuilder.java | 32 ++++++++++++++++++ .../builder/ConfigurationAssemblerTest.java | 6 +++- .../builder/ConfigurationBuilderTest.java | 16 +++++++++ .../builder/CustomConfigurationFactory.java | 11 +++++++ 9 files changed, 174 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java index 8141c25..c88cb09 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java @@ -227,6 +227,21 @@ public interface ConfigurationBuilder<T extends Configuration> extends Builder<T */ <B extends ComponentBuilder<B>> ComponentBuilder<B> newComponent(String name, String pluginName, String value); + /** + * Returns a builder for creating Property:s + * @param name The name of the property. + * @param value The value of the component. + * @return A new PropertyComponentBuilder. + */ + PropertyComponentBuilder newProperty(String name, String value); + + /** + * Returns a builder for creating KeyValuePair:s + * @param key The name + * @param value The value + * @return A new KeyValuePairComponentBuilder. + */ + KeyValuePairComponentBuilder newKeyValuePair(String key, String value); /** * Returns a builder for creating CustomLevels http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java new file mode 100644 index 0000000..d836a94 --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java @@ -0,0 +1,25 @@ +/* + * 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.config.builder.api; + +/** + * Assembler for constructing KeyValuePair Components. + * @since 2.9 + */ +public interface KeyValuePairComponentBuilder extends ComponentBuilder<KeyValuePairComponentBuilder> { + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java new file mode 100644 index 0000000..bbf3995 --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java @@ -0,0 +1,25 @@ +/* + * 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.config.builder.api; + +/** + * Assembler for constructing Property Components. + * @since 2.9 + */ +public interface PropertyComponentBuilder extends ComponentBuilder<PropertyComponentBuilder> { + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java index 183094d..29acea4 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java @@ -41,8 +41,10 @@ import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; import org.apache.logging.log4j.core.config.builder.api.CustomLevelComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder; +import org.apache.logging.log4j.core.config.builder.api.KeyValuePairComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder; +import org.apache.logging.log4j.core.config.builder.api.PropertyComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.ScriptComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder; @@ -410,6 +412,15 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement return new DefaultComponentBuilder<>(this, name, type, value); } + @Override + public PropertyComponentBuilder newProperty(String name, String value) { + return new DefaultPropertyComponentBuilder(this, name, value); + } + + @Override + public KeyValuePairComponentBuilder newKeyValuePair(String key, String value) { + return new DefaultKeyValuePairComponentBuilder(this, key, value); + } @Override public CustomLevelComponentBuilder newCustomLevel(final String name, final int level) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java new file mode 100644 index 0000000..a21e010 --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java @@ -0,0 +1,34 @@ +/* + * 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.config.builder.impl; + +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.builder.api.KeyValuePairComponentBuilder; + +/** + * @since 2.9 + */ +class DefaultKeyValuePairComponentBuilder extends DefaultComponentAndConfigurationBuilder<KeyValuePairComponentBuilder> + implements KeyValuePairComponentBuilder { + + public DefaultKeyValuePairComponentBuilder(final DefaultConfigurationBuilder<? extends Configuration> builder, + final String key, final String value) { + super(builder,"KeyValuePair"); + addAttribute("key", key); + addAttribute("value", value); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java new file mode 100644 index 0000000..cc81a53 --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java @@ -0,0 +1,32 @@ +/* + * 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.config.builder.impl; + +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.builder.api.PropertyComponentBuilder; + +/** + * @since 2.9 + */ +class DefaultPropertyComponentBuilder extends DefaultComponentAndConfigurationBuilder<PropertyComponentBuilder> + implements PropertyComponentBuilder { + + public DefaultPropertyComponentBuilder(final DefaultConfigurationBuilder<? extends Configuration> builder, + final String name, final String value) { + super(builder, name, "Property", value); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java index ccb2cc5..ec4f541 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java @@ -31,6 +31,7 @@ import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LifeCycle; import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.ConfigurationFactory; import org.apache.logging.log4j.core.config.Configurator; @@ -40,6 +41,7 @@ import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory; import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; import org.apache.logging.log4j.core.filter.ThresholdFilter; +import org.apache.logging.log4j.core.layout.GelfLayout; import org.apache.logging.log4j.core.util.Constants; import org.junit.Test; @@ -87,7 +89,9 @@ public class ConfigurationAssemblerTest { assertEquals("Incorrect State: " + config.getState(), config.getState(), LifeCycle.State.STARTED); final Map<String, Appender> appenders = config.getAppenders(); assertNotNull(appenders); - assertTrue("Incorrect number of Appenders: " + appenders.size(), appenders.size() == 1); + assertTrue("Incorrect number of Appenders: " + appenders.size(), appenders.size() == 2); + final KafkaAppender kafkaAppender = (KafkaAppender)appenders.get("Kafka"); + final GelfLayout gelfLayout = (GelfLayout)kafkaAppender.getLayout(); final Map<String, LoggerConfig> loggers = config.getLoggers(); assertNotNull(loggers); assertTrue("Incorrect number of LoggerConfigs: " + loggers.size(), loggers.size() == 2); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java index 431ac01..7ac91e5 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java @@ -42,16 +42,26 @@ public class ConfigurationBuilderTest { builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true)); builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL) .addAttribute("level", Level.DEBUG)); + final AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); appenderBuilder.add(builder.newLayout("PatternLayout"). addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable")); appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY, Filter.Result.NEUTRAL).addAttribute("marker", "FLOW")); builder.add(appenderBuilder); + + final AppenderComponentBuilder appenderBuilder2 = builder.newAppender("Kafka", "Kafka").addAttribute("topic", "my-topic"); + appenderBuilder2.addComponent(builder.newProperty("bootstrap.servers", "localhost:9092")); + appenderBuilder2.add(builder.newLayout("GelfLayout"). + addAttribute("host", "my-host"). + addComponent(builder.newKeyValuePair("extraField", "extraValue"))); + builder.add(appenderBuilder2); + builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true). add(builder.newAppenderRef("Stdout")). addAttribute("additivity", false)); builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout"))); + builder.addProperty("MyKey", "MyValue"); builder.add(builder.newCustomLevel("Panic", 17)); builder.setPackages("foo,bar"); @@ -75,6 +85,12 @@ public class ConfigurationBuilderTest { INDENT + INDENT + INDENT + "<PatternLayout pattern=\"%d [%t] %-5level: %msg%n%throwable\"/>" + EOL + INDENT + INDENT + INDENT + "<MarkerFilter onMatch=\"DENY\" onMisMatch=\"NEUTRAL\" marker=\"FLOW\"/>" + EOL + INDENT + INDENT + "</CONSOLE>" + EOL + + INDENT + INDENT + "<Kafka name=\"Kafka\" topic=\"my-topic\">" + EOL + + INDENT + INDENT + INDENT + "<Property name=\"bootstrap.servers\">localhost:9092</Property>" + EOL + + INDENT + INDENT + INDENT + "<GelfLayout host=\"my-host\">" + EOL + + INDENT + INDENT + INDENT + INDENT + "<KeyValuePair key=\"extraField\" value=\"extraValue\"/>" + EOL + + INDENT + INDENT + INDENT + "</GelfLayout>" + EOL + + INDENT + INDENT + "</Kafka>" + EOL + INDENT + "</Appenders>" + EOL + INDENT + "<Loggers>" + EOL + INDENT + INDENT + "<Logger name=\"org.apache.logging.log4j\" level=\"DEBUG\" includeLocation=\"true\" additivity=\"false\">" + EOL + http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java index ab6bb88..847f79e 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java @@ -43,17 +43,28 @@ public class CustomConfigurationFactory extends ConfigurationFactory { builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true)); builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL) .addAttribute("level", Level.DEBUG)); + final AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); appenderBuilder.add(builder.newLayout("PatternLayout"). addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable")); appenderBuilder.add(builder.newFilter("MarkerFilter", Filter.Result.DENY, Filter.Result.NEUTRAL).addAttribute("marker", "FLOW")); builder.add(appenderBuilder); + + final AppenderComponentBuilder appenderBuilder2 = builder.newAppender("Kafka", "Kafka").addAttribute("topic", "my-topic"); + appenderBuilder2.addComponent(builder.newProperty("bootstrap.servers", "localhost:9092")); + appenderBuilder2.add(builder.newLayout("GelfLayout"). + addAttribute("host", "my-host"). + addComponent(builder.newKeyValuePair("extraField", "extraValue"))); + builder.add(appenderBuilder2); + builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, true). add(builder.newAppenderRef("Stdout")). addAttribute("additivity", false)); builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout"))); + builder.add(builder.newCustomLevel("Panic", 17)); + return builder.build(); }
