Repository: logging-log4j2 Updated Branches: refs/heads/master 26ddb5926 -> 94034c08e
[LOG4J2-1703 Add a Builder to MemoryMappedFileAppender and deprecate MemoryMappedFileAppender.createAppender(). Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/94034c08 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/94034c08 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/94034c08 Branch: refs/heads/master Commit: 94034c08ebdae456141698e9b5c115d2236fdc3b Parents: 26ddb59 Author: Gary Gregory <[email protected]> Authored: Sat Nov 12 02:15:44 2016 -0800 Committer: Gary Gregory <[email protected]> Committed: Sat Nov 12 02:15:44 2016 -0800 ---------------------------------------------------------------------- .../core/appender/MemoryMappedFileAppender.java | 159 ++++++++++++++----- src/changes/changes.xml | 3 + 2 files changed, 123 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/94034c08/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java index daf2e60..643dcd4 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java @@ -28,11 +28,9 @@ 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.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.core.net.Advertiser; import org.apache.logging.log4j.core.util.Booleans; import org.apache.logging.log4j.core.util.Integers; @@ -45,6 +43,89 @@ import org.apache.logging.log4j.core.util.Integers; @Plugin(name = "MemoryMappedFile", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true) public final class MemoryMappedFileAppender extends AbstractOutputStreamAppender<MemoryMappedFileManager> { + /** + * Builds RandomAccessFileAppender instances. + * + * @param <B> + * This builder class + */ + public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B> + implements org.apache.logging.log4j.core.util.Builder<MemoryMappedFileAppender> { + + @PluginBuilderAttribute("fileName") + private String fileName; + + @PluginBuilderAttribute("append") + private boolean append = true; + + @PluginBuilderAttribute("regionLength") + private int regionLength = MemoryMappedFileManager.DEFAULT_REGION_LENGTH; + + @PluginBuilderAttribute("advertise") + private boolean advertise; + + @PluginBuilderAttribute("advertiseURI") + private String advertiseURI; + + @PluginConfiguration + private Configuration config; + + @Override + public MemoryMappedFileAppender build() { + final String name = getName(); + final int actualRegionLength = determineValidRegionLength(name, regionLength); + + if (name == null) { + LOGGER.error("No name provided for MemoryMappedFileAppender"); + return null; + } + + if (fileName == null) { + LOGGER.error("No filename provided for MemoryMappedFileAppender with name " + name); + return null; + } + final Layout<? extends Serializable> layout = getOrCreateLayout(); + final MemoryMappedFileManager manager = MemoryMappedFileManager.getFileManager(fileName, append, isImmediateFlush(), + actualRegionLength, advertiseURI, layout); + if (manager == null) { + return null; + } + + return new MemoryMappedFileAppender(name, layout, getFilter(), manager, fileName, isIgnoreExceptions(), false, + advertise ? config.getAdvertiser() : null); + } + + public B withFileName(String fileName) { + this.fileName = fileName; + return asBuilder(); + } + + public B withAppend(boolean append) { + this.append = append; + return asBuilder(); + } + + public B withRegionLength(int regionLength) { + this.regionLength = regionLength; + return asBuilder(); + } + + public B withAdvertise(boolean advertise) { + this.advertise = advertise; + return asBuilder(); + } + + public B withAdvertiseURI(String advertiseURI) { + this.advertiseURI = advertiseURI; + return asBuilder(); + } + + public B withConfig(Configuration config) { + this.config = config; + return asBuilder(); + } + } + private static final int BIT_POSITION_1GB = 30; // 2^30 ~= 1GB private static final int MAX_REGION_LENGTH = 1 << BIT_POSITION_1GB; private static final int MIN_REGION_LENGTH = 256; @@ -134,50 +215,50 @@ public final class MemoryMappedFileAppender extends AbstractOutputStreamAppender * @param advertiseURI The advertised URI which can be used to retrieve the file contents. * @param config The Configuration. * @return The FileAppender. + * @deprecated Use {@link #newBuilder()}. */ - @PluginFactory + @Deprecated public static MemoryMappedFileAppender createAppender( - // @formatter:off - @PluginAttribute("fileName") final String fileName, // - @PluginAttribute("append") final String append, // - @PluginAttribute("name") final String name, // - @PluginAttribute("immediateFlush") final String immediateFlush, // - @PluginAttribute("regionLength") final String regionLengthStr, // - @PluginAttribute("ignoreExceptions") final String ignore, // - @PluginElement("Layout") Layout<? extends Serializable> layout, // - @PluginElement("Filter") final Filter filter, // - @PluginAttribute("advertise") final String advertise, // - @PluginAttribute("advertiseURI") final String advertiseURI, // - @PluginConfiguration final Configuration config) { - // @formatter:on + // @formatter:off + final String fileName, // + final String append, // + final String name, // + final String immediateFlush, // + final String regionLengthStr, // + final String ignore, // + final Layout<? extends Serializable> layout, // + final Filter filter, // + final String advertise, // + final String advertiseURI, // + final Configuration config) { + // @formatter:on final boolean isAppend = Booleans.parseBoolean(append, true); - final boolean isForce = Booleans.parseBoolean(immediateFlush, false); + final boolean isImmediateFlush = Booleans.parseBoolean(immediateFlush, false); final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); final boolean isAdvertise = Boolean.parseBoolean(advertise); final int regionLength = Integers.parseInt(regionLengthStr, MemoryMappedFileManager.DEFAULT_REGION_LENGTH); - final int actualRegionLength = determineValidRegionLength(name, regionLength); - - if (name == null) { - LOGGER.error("No name provided for MemoryMappedFileAppender"); - return null; - } - if (fileName == null) { - LOGGER.error("No filename provided for MemoryMappedFileAppender with name " + name); - return null; - } - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - final MemoryMappedFileManager manager = MemoryMappedFileManager.getFileManager(fileName, isAppend, isForce, - actualRegionLength, advertiseURI, layout); - if (manager == null) { - return null; - } + // @formatter:off + return newBuilder() + .withAdvertise(isAdvertise) + .withAdvertiseURI(advertiseURI) + .withAppend(isAppend) + .withConfig(config) + .withFileName(fileName) + .withFilter(filter) + .withIgnoreExceptions(ignoreExceptions) + .withImmediateFlush(isImmediateFlush) + .withLayout(layout) + .withName(name) + .withRegionLength(regionLength) + .build(); + // @formatter:on + } - return new MemoryMappedFileAppender(name, layout, filter, manager, fileName, ignoreExceptions, false, - isAdvertise ? config.getAdvertiser() : null); + @PluginBuilderFactory + public static <B extends Builder<B>> B newBuilder() { + return new Builder<B>().asBuilder(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/94034c08/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 38da035..356785b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -132,6 +132,9 @@ <action issue="LOG4J2-1701" dev="ggregory" type="add"> Add a Builder to RandomAccessFileAppender and deprecate RandomAccessFileAppender.createAppender(). </action> + <action issue="LOG4J2-1703" dev="ggregory" type="add"> + Add a Builder to MemoryMappedFileAppender and deprecate MemoryMappedFileAppender.createAppender(). + </action> </release> <release version="2.7" date="2016-10-02" description="GA Release 2.7"> <action issue="LOG4J2-1618" dev="rpopma" type="fix" due-to="Raman Gupta">
