Repository: logging-log4j2 Updated Branches: refs/heads/master 83deb4fde -> 8f6e87a7c
Example ConfigurationBuilder that constructs a RollingFileAppender Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/0106aa21 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0106aa21 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0106aa21 Branch: refs/heads/master Commit: 0106aa2129fff23a41449c03003b852125d8aa4e Parents: 83deb4f Author: Ralph Goers <[email protected]> Authored: Sat Jan 23 20:01:23 2016 -0700 Committer: Ralph Goers <[email protected]> Committed: Sun Jan 24 00:37:43 2016 -0700 ---------------------------------------------------------------------- .../core/config/AbstractConfiguration.java | 20 ++++++--- .../log4j/core/config/TestConfigurator.java | 45 ++++++++++++++++++- src/site/xdoc/manual/customconfig.xml | 46 +++++++++++++++++--- 3 files changed, 98 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0106aa21/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java index 765336e..9974917 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java @@ -344,7 +344,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement } private List<Appender> getAsyncAppenders(final Appender[] all) { - final List<Appender> result = new ArrayList<Appender>(); + final List<Appender> result = new ArrayList<>(); for (int i = all.length - 1; i >= 0; --i) { if (all[i] instanceof AsyncAppender) { result.add(all[i]); @@ -416,12 +416,20 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement } protected void preConfigure(Node node) { - for (final Node child : node.getChildren()) { - Class<?> clazz = child.getType().getPluginClass(); - if (clazz.isAnnotationPresent(Scheduled.class)) { - configurationScheduler.incrementScheduledItems(); + try { + for (final Node child : node.getChildren()) { + if (child.getType() == null) { + LOGGER.error("Unable to locate plugin type for " + child.getName()); + continue; + } + Class<?> clazz = child.getType().getPluginClass(); + if (clazz.isAnnotationPresent(Scheduled.class)) { + configurationScheduler.incrementScheduledItems(); + } + preConfigure(child); } - preConfigure(child); + } catch (Exception ex) { + LOGGER.error("Error capturing node data for node " + node.getName(), ex); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0106aa21/log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java index 057deee..b5a22b1 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java @@ -32,8 +32,10 @@ import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder; +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.ConfigurationBuilderFactory; +import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder; import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; import org.apache.logging.log4j.core.filter.CompositeFilter; import org.apache.logging.log4j.core.layout.PatternLayout; @@ -90,7 +92,6 @@ public class TestConfigurator { } } - @Test public void testFromFile() throws Exception { ctx = Configurator.initialize("Test1", "target/test-classes/log4j2-config.xml"); @@ -387,6 +388,48 @@ public class TestConfigurator { } @Test + public void testRolling() throws Exception { + ConfigurationBuilder< BuiltConfiguration > builder = + ConfigurationBuilderFactory.newConfigurationBuilder(); + + builder.setStatusLevel( Level.ERROR); + builder.setConfigurationName("RollingBuilder"); + // create the console appender + 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")); + builder.add( appenderBuilder ); + + LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout") + .addAttribute("pattern", "%d [%t] %-5level: %msg%n"); + ComponentBuilder triggeringPolicy = builder.newComponent("Policies") + .addComponent(builder.newComponent("CronTriggeringPolicy").addAttribute("schedule", "0 0 0 * * ?")) + .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "100M")); + appenderBuilder = builder.newAppender("rolling", "RollingFile") + .addAttribute("fileName", "target/rolling.log") + .addAttribute("filePattern", "target/archive/rolling-%d{MM-dd-yy}.log.gz") + .add(layoutBuilder) + .addComponent(triggeringPolicy); + builder.add(appenderBuilder); + + // create the new logger + builder.add( builder.newLogger( "TestLogger", Level.DEBUG ) + .add( builder.newAppenderRef( "rolling" ) ) + .addAttribute( "additivity", false ) ); + + builder.add( builder.newRootLogger( Level.DEBUG ) + .add( builder.newAppenderRef( "rolling" ) ) ); + Configuration config = builder.build(); + assertNotNull("No rolling file appender", config.getAppender("rolling")); + assertEquals("Unexpected Configuration", "RollingBuilder", config.getName()); + // Initialize the new configuration + LoggerContext ctx = Configurator.initialize( config ); + Configurator.shutdown(ctx); + + } + + @Test public void testBuilderWithScripts() throws Exception { String script = "if (logEvent.getLoggerName().equals(\"NoLocation\")) {\n" + " return \"NoLocation\";\n" + http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0106aa21/src/site/xdoc/manual/customconfig.xml ---------------------------------------------------------------------- diff --git a/src/site/xdoc/manual/customconfig.xml b/src/site/xdoc/manual/customconfig.xml index 485e93a..ed84279 100644 --- a/src/site/xdoc/manual/customconfig.xml +++ b/src/site/xdoc/manual/customconfig.xml @@ -164,16 +164,50 @@ builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Re .addAttribute("level", Level.DEBUG)); 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")); +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); -builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG). - add(builder.newAppenderRef("Stdout")).addAttribute("additivity", false)); +builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG) + .add(builder.newAppenderRef("Stdout")).addAttribute("additivity", false)); builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout"))); ctx = Configurator.initialize(builder.build()); ]]></pre> + <p>This example shows how to create a configuration that includes a RollingFileAppender.</p> + <pre class="prettyprint linenum"><![CDATA[ +ConfigurationBuilder< BuiltConfiguration > builder = ConfigurationBuilderFactory.newConfigurationBuilder(); + +builder.setStatusLevel( Level.ERROR); +builder.setConfigurationName("RollingBuilder"); +// create a console appender +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")); +builder.add( appenderBuilder ); +// create a rolling file appender +LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout") + .addAttribute("pattern", "%d [%t] %-5level: %msg%n"); +ComponentBuilder triggeringPolicy = builder.newComponent("Policies") + .addComponent(builder.newComponent("CronTriggeringPolicy").addAttribute("schedule", "0 0 0 * * ?")) + .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "100M")); +appenderBuilder = builder.newAppender("rolling", "RollingFile") + .addAttribute("fileName", "target/rolling.log") + .addAttribute("filePattern", "target/archive/rolling-%d{MM-dd-yy}.log.gz") + .add(layoutBuilder) + .addComponent(triggeringPolicy); +builder.add(appenderBuilder); + +// create the new logger +builder.add( builder.newLogger( "TestLogger", Level.DEBUG ) + .add( builder.newAppenderRef( "rolling" ) ) + .addAttribute( "additivity", false ) ); + +builder.add( builder.newRootLogger( Level.DEBUG ) + .add( builder.newAppenderRef( "rolling" ) ) ); +LoggerContext ctx = Configurator.intitialize(builder.build()); +]]></pre> </subsection> <a name="Hybrid"/>
