diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java index 9c4517f..6229386 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java @@ -25,14 +25,18 @@ import org.apache.logging.log4j.core.Layout; 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.config.plugins.validation.constraints.Required; 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; + /** * File Appender. */ @@ -118,33 +122,21 @@ public final class FileAppender extends AbstractOutputStreamAppender 0) { - LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIo); - } final boolean isFlush = Booleans.parseBoolean(immediateFlush, true); final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); - if (name == null) { - LOGGER.error("No name provided for FileAppender"); - return null; - } - - if (fileName == null) { - LOGGER.error("No filename provided for FileAppender with name " + name); + final MutableBoolean isBufferedWrap = new MutableBoolean(isBuffered); + + if (!checkParameters(fileName, name, isLocking, isBufferedWrap, bufferSize)) { return null; - } + } + if (layout == null) { layout = PatternLayout.createDefaultLayout(); } - final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBuffered, advertiseUri, + final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBufferedWrap.value, advertiseUri, layout, bufferSize); if (manager == null) { return null; @@ -153,4 +145,169 @@ public final class FileAppender extends AbstractOutputStreamAppender 0) { + LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIo); + } + return true; + } + + public static class Builder implements org.apache.logging.log4j.core.util.Builder { + + @PluginElement("Layout") + private Layout layout = PatternLayout.createDefaultLayout();; + + @PluginElement("Filter") + private Filter filter = null; + + @PluginBuilderAttribute + @Required + private String fileName; + + @PluginBuilderAttribute + @Required + private String name; + + @PluginBuilderAttribute + private boolean append = true; + + @PluginBuilderAttribute + private boolean locking = false; + + @PluginBuilderAttribute + private boolean immediateFlush = true; + + @PluginBuilderAttribute + private boolean ignoreExceptions = true; + + @PluginBuilderAttribute + private boolean bufferedIo = true; + + @PluginBuilderAttribute + private int bufferSize = DEFAULT_BUFFER_SIZE; + + @PluginBuilderAttribute + private boolean advertise = true; + + @PluginBuilderAttribute + private String advertiseUri = null; + + @PluginConfiguration + @Required + private Configuration config = null; + + public Builder setLayout(final Layout layout) { + this.layout = layout; + return this; + } + + public Builder setFilter(final Filter filter) { + this.filter = filter; + return this; + } + + public Builder setFileName(final String fileName) { + this.fileName = fileName; + return this; + } + + public Builder setName(final String name) { + this.name = name; + return this; + } + + public Builder setAppend(final boolean append) { + this.append = append; + return this; + } + + public Builder setLocking(final boolean locking) { + this.locking = locking; + return this; + } + + public Builder setImmediateFlush(final boolean immediateFlush) { + this.immediateFlush = immediateFlush; + return this; + } + + public Builder setIgnoreExceptions(final boolean ignoreExceptions) { + this.ignoreExceptions = ignoreExceptions; + return this; + } + + public Builder setBufferedIo(final boolean bufferedIo) { + this.bufferedIo = bufferedIo; + return this; + } + + public Builder setBufferSize(final int bufferSize) { + this.bufferSize = bufferSize; + return this; + } + + public Builder setAdvertise(final boolean advertise) { + this.advertise = advertise; + return this; + } + + public Builder setAdvertiseUri(final String advertiseUri) { + this.advertiseUri = advertiseUri; + return this; + } + + public Builder setConfiguration(final Configuration config) { + this.config = config; + return this; + } + + @Override + public FileAppender build() { + final MutableBoolean bufferedIoWrap = new MutableBoolean(bufferedIo); + if (!checkParameters(fileName, name, locking, bufferedIoWrap, bufferSize)) { + return null; + } + + final FileManager manager = FileManager.getFileManager(fileName, append, locking, bufferedIoWrap.value, + advertiseUri, layout, bufferSize); + + if (manager == null) { + return null; + } + + return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions, immediateFlush, + advertise ? config.getAdvertiser() : null); + } + } + }