Repository: logging-log4j2 Updated Branches: refs/heads/master b0bc4c843 -> 80354c6d2
[LOG4J2-1770]: Add Builder to JdbcAppender Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/80354c6d Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/80354c6d Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/80354c6d Branch: refs/heads/master Commit: 80354c6d272a8975f129f8f40b848d6a389ea54d Parents: b0bc4c8 Author: Matt Sicker <[email protected]> Authored: Fri Jan 6 23:34:09 2017 -0600 Committer: Matt Sicker <[email protected]> Committed: Fri Jan 6 23:34:09 2017 -0600 ---------------------------------------------------------------------- .../core/appender/db/jdbc/JdbcAppender.java | 162 ++++++++++++++----- src/changes/changes.xml | 3 + 2 files changed, 128 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/80354c6d/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java index ccc0fa5..3aa5644 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java @@ -16,15 +16,23 @@ */ package org.apache.logging.log4j.core.appender.db.jdbc; +import java.io.Serializable; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Objects; + import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Core; import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.appender.AbstractAppender; import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender; 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.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.util.Assert; import org.apache.logging.log4j.core.util.Booleans; /** @@ -55,52 +63,132 @@ public final class JdbcAppender extends AbstractDatabaseAppender<JdbcDatabaseMan /** * Factory method for creating a JDBC appender within the plugin manager. * - * @param name The name of the appender. - * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise - * they are propagated to the caller. - * @param filter The filter, if any, to use. - * @param connectionSource The connections source from which database connections should be retrieved. - * @param bufferSize If an integer greater than 0, this causes the appender to buffer log events and flush whenever - * the buffer reaches this size. - * @param tableName The name of the database table to insert log events into. - * @param columnConfigs Information about the columns that log event data should be inserted into and how to insert - * that data. - * @return a new JDBC appender. + * @see Builder + * @deprecated use {@link #newBuilder()} */ - @PluginFactory - public static JdbcAppender createAppender( - @PluginAttribute("name") final String name, - @PluginAttribute("ignoreExceptions") final String ignore, - @PluginElement("Filter") final Filter filter, - @PluginElement("ConnectionSource") final ConnectionSource connectionSource, - @PluginAttribute("bufferSize") final String bufferSize, - @PluginAttribute("tableName") final String tableName, - @PluginElement("ColumnConfigs") final ColumnConfig[] columnConfigs) { + @Deprecated + public static <B extends Builder<B>> JdbcAppender createAppender(final String name, final String ignore, + final Filter filter, + final ConnectionSource connectionSource, + final String bufferSize, final String tableName, + final ColumnConfig[] columnConfigs) { + Assert.requireNonEmpty(name, "Name cannot be empty"); + Objects.requireNonNull(connectionSource, "ConnectionSource cannot be null"); + Assert.requireNonEmpty(tableName, "Table name cannot be empty"); + Assert.requireNonEmpty(columnConfigs, "ColumnConfigs cannot be empty"); final int bufferSizeInt = AbstractAppender.parseInt(bufferSize, 0); final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); - final StringBuilder managerName = new StringBuilder("jdbcManager{ description=").append(name) - .append(", bufferSize=").append(bufferSizeInt).append(", connectionSource=") - .append(connectionSource.toString()).append(", tableName=").append(tableName).append(", columns=[ "); + return JdbcAppender.<B>newBuilder() + .setBufferSize(bufferSizeInt) + .setColumnConfigs(columnConfigs) + .setConnectionSource(connectionSource) + .setTableName(tableName) + .withName(name) + .withIgnoreExceptions(ignoreExceptions) + .withFilter(filter) + .build(); + } + + @PluginBuilderFactory + public static <B extends Builder<B>> B newBuilder() { + return new Builder<B>().asBuilder(); + } + + public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> + implements org.apache.logging.log4j.core.util.Builder<JdbcAppender> { + + @PluginElement("ConnectionSource") + @Required(message = "No ConnectionSource provided") + private ConnectionSource connectionSource; + + @PluginBuilderAttribute + private int bufferSize; + + @PluginBuilderAttribute + @Required(message = "No table name provided") + private String tableName; + + @PluginElement("ColumnConfigs") + private ColumnConfig[] columnConfigs; + + // TODO: LOG4J2-424 +// @PluginElement("ColumnMappings") +// private ColumnMapping[] columnMappings; + + /** + * The connections source from which database connections should be retrieved. + */ + public B setConnectionSource(final ConnectionSource connectionSource) { + this.connectionSource = connectionSource; + return asBuilder(); + } - int i = 0; - for (final ColumnConfig column : columnConfigs) { - if (i++ > 0) { - managerName.append(", "); + /** + * If an integer greater than 0, this causes the appender to buffer log events and flush whenever the buffer + * reaches this size. + */ + public B setBufferSize(final int bufferSize) { + this.bufferSize = bufferSize; + return asBuilder(); + } + + /** + * The name of the database table to insert log events into. + */ + public B setTableName(final String tableName) { + this.tableName = tableName; + return asBuilder(); + } + + /** + * Information about the columns that log event data should be inserted into and how to insert that data. + */ + public B setColumnConfigs(final ColumnConfig... columnConfigs) { + this.columnConfigs = columnConfigs; + return asBuilder(); + } + +// public B setColumnMappings(final ColumnMapping... columnMappings) { +// this.columnMappings = columnMappings; +// return asBuilder(); +// } + + @Override + public JdbcAppender build() { + final String managerName = "JdbcManager{name=" + getName() + ", bufferSize=" + bufferSize + ", tableName=" + + tableName + ", columnConfigs=" + Arrays.toString(columnConfigs) + '}'; + final JdbcDatabaseManager manager = JdbcDatabaseManager.getJDBCDatabaseManager(managerName, bufferSize, + connectionSource, tableName, columnConfigs); + if (manager == null) { + return null; } - managerName.append(column.toString()); + return new JdbcAppender(getName(), getFilter(), isIgnoreExceptions(), manager); } - managerName.append(" ] }"); + @Override + @Deprecated + public Layout<? extends Serializable> getLayout() { + throw new UnsupportedOperationException(); + } - final JdbcDatabaseManager manager = JdbcDatabaseManager.getJDBCDatabaseManager( - managerName.toString(), bufferSizeInt, connectionSource, tableName, columnConfigs - ); - if (manager == null) { - return null; + @Override + @Deprecated + public B withLayout(final Layout<? extends Serializable> layout) { + throw new UnsupportedOperationException(); } - return new JdbcAppender(name, filter, ignoreExceptions, manager); + @Override + @Deprecated + public Layout<? extends Serializable> getOrCreateLayout() { + throw new UnsupportedOperationException(); + } + + @Override + @Deprecated + public Layout<? extends Serializable> getOrCreateLayout(final Charset charset) { + throw new UnsupportedOperationException(); + } } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/80354c6d/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a1280fc..690a3fd 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -228,6 +228,9 @@ <action issue="LOG4J2-1302" dev="rpopma" type="update"> The log4j-slf4j-impl module now declares a runtime dependency on log4j-core. While not technically required, this makes the log4j-slf4j-impl module behave similarly to slf4j-log4j12, and facilitates migration to Log4j 2. </action> + <action issue="LOG4J2-1770" dev="mattsicker" type="add"> + Add a Builder to JdbcAppender and deprecate JdbcAppender.createAppender(). + </action> <action issue="LOG4J2-1764" dev="mattsicker" type="add"> Use MethodHandle in ContextDataFactory cached constructor. </action>
