Repository: logging-log4j2 Updated Branches: refs/heads/master 57825ccd1 -> 977095f72
[LOG4J2-1609] Add a Builder to ServletAppender and deprecate factory method. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/977095f7 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/977095f7 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/977095f7 Branch: refs/heads/master Commit: 977095f72b02afdadbc555371100b07c8825f90f Parents: 57825cc Author: Gary Gregory <ggreg...@apache.org> Authored: Thu Sep 22 13:25:24 2016 -0700 Committer: Gary Gregory <ggreg...@apache.org> Committed: Thu Sep 22 13:25:24 2016 -0700 ---------------------------------------------------------------------- .../log4j/web/appender/ServletAppender.java | 80 +++++++++++++------- src/changes/changes.xml | 5 +- 2 files changed, 56 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/977095f7/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java ---------------------------------------------------------------------- diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java index 8bddc47..1a592c2 100644 --- a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java +++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java @@ -17,6 +17,7 @@ package org.apache.logging.log4j.web.appender; import java.io.Serializable; + import javax.servlet.ServletContext; import org.apache.logging.log4j.core.Filter; @@ -24,10 +25,7 @@ import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.AbstractAppender; 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.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.layout.AbstractStringLayout; import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.web.WebLoggerContextUtils; @@ -38,46 +36,72 @@ import org.apache.logging.log4j.web.WebLoggerContextUtils; @Plugin(name = "Servlet", category = "Core", elementType = "appender", printObject = true) public class ServletAppender extends AbstractAppender { - private final ServletContext servletContext; + public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> + implements org.apache.logging.log4j.core.util.Builder<ServletAppender> { + + @Override + public ServletAppender build() { + final String name = getName(); + if (name == null) { + LOGGER.error("No name provided for ServletAppender"); + } + final ServletContext servletContext = WebLoggerContextUtils.getServletContext(); + if (servletContext == null) { + LOGGER.error("No servlet context is available"); + return null; + } + Layout<? extends Serializable> layout = getLayout(); + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } else if (!(layout instanceof AbstractStringLayout)) { + LOGGER.error("Layout must be a StringLayout to log to ServletContext"); + return null; + } + return new ServletAppender(name, layout, getFilter(), servletContext, isIgnoreExceptions()); + } - private ServletAppender(final String name, final AbstractStringLayout layout, final Filter filter, - final ServletContext servletContext, final boolean ignoreExceptions) { - super(name, filter, layout, ignoreExceptions); - this.servletContext = servletContext; + } + + @PluginBuilderFactory + public static <B extends Builder<B>> B newBuilder() { + return new Builder<B>().asBuilder(); } + private final ServletContext servletContext; + + + private ServletAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter, + final ServletContext servletContext, final boolean ignoreExceptions) { + super(name, filter, layout, ignoreExceptions); + this.servletContext = servletContext; + } + @Override public void append(final LogEvent event) { servletContext.log(((AbstractStringLayout) getLayout()).toSerializable(event), event.getThrown()); } /** - * Create a Servlet Appender. + * Creates a Servlet Appender. * @param layout The layout to use (required). Must extend {@link AbstractStringLayout}. * @param filter The Filter or null. * @param name The name of the Appender (required). * @param ignoreExceptions If {@code true} (default) exceptions encountered when appending events are logged; * otherwise they are propagated to the caller. * @return The ServletAppender. + * @deprecated Use {@link #newBuilder()}. */ - @PluginFactory - public static ServletAppender createAppender( - @PluginElement("Layout") Layout<? extends Serializable> layout, - @PluginElement("Filter") final Filter filter, - @PluginAttribute("name") @Required(message = "No name provided for ServletAppender") final String name, - @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions) { - final ServletContext servletContext = WebLoggerContextUtils.getServletContext(); - if (servletContext == null) { - LOGGER.error("No servlet context is available"); - return null; - } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } else if (!(layout instanceof AbstractStringLayout)) { - LOGGER.error("Layout must be a StringLayout to log to ServletContext"); - return null; - } - return new ServletAppender(name, (AbstractStringLayout) layout, filter, servletContext, ignoreExceptions); + @Deprecated + public static ServletAppender createAppender(Layout<? extends Serializable> layout, final Filter filter, + final String name, final boolean ignoreExceptions) { + // @formatter:off + return newBuilder() + .withFilter(filter) + .withIgnoreExceptions(ignoreExceptions) + .withLayout(layout) + .withName(name) + .build(); + // @formatter:on } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/977095f7/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7e69b6d..526853c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -202,7 +202,10 @@ SocketAppender now supports IO buffering. </action> <action issue="LOG4J2-1557" dev="ggregory" type="add"> - Added a Builder for the SocketAppender (deprecates factory method). + Add a Builder for the SocketAppender (deprecates factory method). + </action> + <action issue="LOG4J2-1609" dev="ggregory" type="add"> + Add a Builder to ServletAppender and deprecate factory method. </action> <action issue="LOG4J2-1553" dev="ggregory" type="add"> AbstractManager now implements AutoCloseable.