I'd much prefer if we had a leaner core repo for more frequent releases (RERO after all). I've only done the release process a couple times, but Ralph is right: more modules means a larger pain in the ass. The other thing we could really benefit from would be speeding up unit tests. If we can run them without forking, I think that would help a lot in execution speedups. I'm not sure if using Gradle or something else instead of Maven would speed things up there, but I believe there are more low hanging fruit we could handle before something that drastic.
On 18 January 2018 at 23:31, Ralph Goers <ralph.go...@dslextreme.com> wrote: > Gary, I am complaining because I perform the releases. You never have. We > keep adding more and more crap to the build and it keeps taking longer and > longer. Af far as I am concerned that is a valid technical reason. > > My -1 stands. > > Ralph > > > > On Jan 18, 2018, at 10:24 PM, Gary Gregory <garydgreg...@gmail.com> > wrote: > > > > On Thu, Jan 18, 2018 at 10:20 PM, Ralph Goers < > ralph.go...@dslextreme.com> > > wrote: > > > >> OK, but that doesn’t resolve the initial problem. The log4j 2 project is > >> too large. > >> > > > > From what I've experienced, folks complain about the size of the api and > > core jars, not the Maven project. > > > > What is the target size/metric if it is currently "too large"? ;-) > > > > Gary > > > > > >> Ralph > >> > >>> On Jan 18, 2018, at 10:15 PM, Gary Gregory <garydgreg...@gmail.com> > >> wrote: > >>> > >>> On Thu, Jan 18, 2018 at 9:43 PM, Ralph Goers < > ralph.go...@dslextreme.com > >>> > >>> wrote: > >>> > >>>> In addition, the build is now failing to compile on Jenkins. > >>>> > >>> > >>> Oops, please accept my apologies. I got caught by the Eclipse compiler > >>> being more forgiving (or more powerful) than the Oracle compiler in the > >>> generics department. All of that despite the Maven partial builds I > ran. > >> I > >>> must have not run the clean goal or some-such. > >>> > >>> Gary > >>> > >>> > >>>> Ralph > >>>> > >>>>> On Jan 18, 2018, at 9:28 PM, Ralph Goers <ralph.go...@dslextreme.com > > > >>>> wrote: > >>>>> > >>>>> -1 > >>>>> > >>>>> Please revert and move this to the log4j plugins project. > >>>>> > >>>>> Ralph > >>>>> > >>>>>> On Jan 18, 2018, at 8:54 PM, ggreg...@apache.org wrote: > >>>>>> > >>>>>> Repository: logging-log4j2 > >>>>>> Updated Branches: > >>>>>> refs/heads/master bb6fcd09e -> 639f093b8 > >>>>>> > >>>>>> > >>>>>> [LOG4J2-2186] Add a JDBC ConnectionSource that provides pooling > >> through > >>>>>> Apache Commons DBCP 2. > >>>>>> > >>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo > >>>>>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ > >>>> commit/639f093b > >>>>>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ > >>>> 639f093b > >>>>>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ > >>>> 639f093b > >>>>>> > >>>>>> Branch: refs/heads/master > >>>>>> Commit: 639f093b8103df2c2eda8d62fd12d7619d98ac04 > >>>>>> Parents: bb6fcd0 > >>>>>> Author: Gary Gregory <garydgreg...@gmail.com> > >>>>>> Authored: Thu Jan 18 20:54:47 2018 -0700 > >>>>>> Committer: Gary Gregory <garydgreg...@gmail.com> > >>>>>> Committed: Thu Jan 18 20:54:47 2018 -0700 > >>>>>> > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> log4j-jdbc-dbcp2/pom.xml | 170 > >>>> +++++++++++++++++++ > >>>>>> .../db/jdbc/PoolingDriverConnectionSource.java | 155 > >> +++++++++++++++++ > >>>>>> log4j-jdbc-dbcp2/src/site/manual/index.md | 35 ++++ > >>>>>> log4j-jdbc-dbcp2/src/site/site.xml | 52 ++++++ > >>>>>> .../jdbc/PoolingDriverConnectionSourceTest.java | 96 +++++++++++ > >>>>>> pom.xml | 1 + > >>>>>> src/changes/changes.xml | 3 + > >>>>>> src/site/xdoc/manual/appenders.xml | 28 ++- > >>>>>> 8 files changed, 537 insertions(+), 3 deletions(-) > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/log4j-jdbc-dbcp2/pom.xml > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/log4j-jdbc-dbcp2/pom.xml b/log4j-jdbc-dbcp2/pom.xml > >>>>>> new file mode 100644 > >>>>>> index 0000000..18e0e86 > >>>>>> --- /dev/null > >>>>>> +++ b/log4j-jdbc-dbcp2/pom.xml > >>>>>> @@ -0,0 +1,170 @@ > >>>>>> +<?xml version="1.0" encoding="UTF-8"?> > >>>>>> +<!-- ~ Licensed to the Apache Software Foundation (ASF) under one > or > >>>> more ~ contributor license agreements. See the NOTICE > >>>>>> + file distributed with ~ this work for additional information > >>>> regarding copyright ownership. ~ The ASF licenses this file > >>>>>> + to You under the Apache License, Version 2.0 ~ (the "License"); > you > >>>> may not use this file except in compliance with ~ the > >>>>>> + License. You may obtain a copy of the License at ~ ~ > >>>> http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by > >>>> applicable > >>>>>> + law or agreed to in writing, software ~ distributed under the > >>>> License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES > >>>>>> + OR CONDITIONS OF ANY KIND, either express or implied. ~ See the > >>>> License for the specific language governing permissions and > >>>>>> + ~ limitations under the License. --> > >>>>>> + > >>>>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" > >>>> http://www.w3.org/2001/XMLSchema-instance" > >>>>>> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 > >>>> http://maven.apache.org/xsd/maven-4.0.0.xsd"> > >>>>>> + <parent> > >>>>>> + <groupId>org.apache.logging.log4j</groupId> > >>>>>> + <artifactId>log4j</artifactId> > >>>>>> + <version>2.10.1-SNAPSHOT</version> > >>>>>> + </parent> > >>>>>> + <modelVersion>4.0.0</modelVersion> > >>>>>> + > >>>>>> + <artifactId>log4j-jdbc-dbcp2</artifactId> > >>>>>> + <name>Apache Log4j JDBC DBCP 2</name> > >>>>>> + <description> > >>>>>> + Connection source for the JDBC Appender using on Apache Commons > >>>> DBCP 2. > >>>>>> + </description> > >>>>>> + <properties> > >>>>>> + <log4jParentDir>${basedir}/..</log4jParentDir> > >>>>>> + <docLabel>Log4j JDBC DBCP 2 Documentation</docLabel> > >>>>>> + <projectDir>/log4j-jdbc-dbcp2</projectDir> > >>>>>> + <module.name>org.apache.logging.log4j.jdbc.dbcp2</module.name> > >>>>>> + </properties> > >>>>>> + > >>>>>> + <dependencies> > >>>>>> + <dependency> > >>>>>> + <groupId>org.apache.logging.log4j</groupId> > >>>>>> + <artifactId>log4j-core</artifactId> > >>>>>> + </dependency> > >>>>>> + <dependency> > >>>>>> + <groupId>org.apache.commons</groupId> > >>>>>> + <artifactId>commons-dbcp2</artifactId> > >>>>>> + <version>2.2.0</version> > >>>>>> + </dependency> > >>>>>> + <!-- Test Dependencies --> > >>>>>> + <dependency> > >>>>>> + <groupId>junit</groupId> > >>>>>> + <artifactId>junit</artifactId> > >>>>>> + </dependency> > >>>>>> + <dependency> > >>>>>> + <groupId>org.apache.logging.log4j</groupId> > >>>>>> + <artifactId>log4j-api</artifactId> > >>>>>> + <type>test-jar</type> > >>>>>> + </dependency> > >>>>>> + <dependency> > >>>>>> + <groupId>org.apache.logging.log4j</groupId> > >>>>>> + <artifactId>log4j-core</artifactId> > >>>>>> + <type>test-jar</type> > >>>>>> + </dependency> > >>>>>> + <dependency> > >>>>>> + <groupId>com.h2database</groupId> > >>>>>> + <artifactId>h2</artifactId> > >>>>>> + <scope>test</scope> > >>>>>> + </dependency> > >>>>>> + </dependencies> > >>>>>> + > >>>>>> + <build> > >>>>>> + <plugins> > >>>>>> + <plugin> > >>>>>> + <groupId>org.apache.felix</groupId> > >>>>>> + <artifactId>maven-bundle-plugin</artifactId> > >>>>>> + <configuration> > >>>>>> + <instructions> > >>>>>> + <Fragment-Host>org.apache.logging.log4j.core.appender. > >>>> db.jdbc</Fragment-Host> > >>>>>> + <Export-Package>*</Export-Package> > >>>>>> + </instructions> > >>>>>> + </configuration> > >>>>>> + </plugin> > >>>>>> + </plugins> > >>>>>> + </build> > >>>>>> + <reporting> > >>>>>> + <plugins> > >>>>>> + <plugin> > >>>>>> + <groupId>org.apache.maven.plugins</groupId> > >>>>>> + <artifactId>maven-changes-plugin</artifactId> > >>>>>> + <version>${changes.plugin.version}</version> > >>>>>> + <reportSets> > >>>>>> + <reportSet> > >>>>>> + <reports> > >>>>>> + <report>changes-report</report> > >>>>>> + </reports> > >>>>>> + </reportSet> > >>>>>> + </reportSets> > >>>>>> + <configuration> > >>>>>> + <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</ > >>>> issueLinkTemplate> > >>>>>> + <useJql>true</useJql> > >>>>>> + </configuration> > >>>>>> + </plugin> > >>>>>> + <plugin> > >>>>>> + <groupId>org.apache.maven.plugins</groupId> > >>>>>> + <artifactId>maven-checkstyle-plugin</artifactId> > >>>>>> + <version>${checkstyle.plugin.version}</version> > >>>>>> + <configuration> > >>>>>> + <!--<propertiesLocation>${vfs.parent.dir}/checkstyle. > >>>> properties</propertiesLocation> --> > >>>>>> + <configLocation>${log4jParentDir}/checkstyle. > >>>> xml</configLocation> > >>>>>> + <suppressionsLocation>${log4jParentDir}/checkstyle- > >>>> suppressions.xml</suppressionsLocation> > >>>>>> + <enableRulesSummary>false</enableRulesSummary> > >>>>>> + <propertyExpansion>basedir=${ > basedir}</propertyExpansion> > >>>>>> + <propertyExpansion>licensedir= > >> ${log4jParentDir}/checkstyle- > >>>> header.txt</propertyExpansion> > >>>>>> + </configuration> > >>>>>> + </plugin> > >>>>>> + <plugin> > >>>>>> + <groupId>org.apache.maven.plugins</groupId> > >>>>>> + <artifactId>maven-javadoc-plugin</artifactId> > >>>>>> + <version>${javadoc.plugin.version}</version> > >>>>>> + <configuration> > >>>>>> + <bottom><![CDATA[<p align="center">Copyright © > >>>> {inceptionYear}-{currentYear} {organizationName}. All Rights > >> Reserved.<br /> > >>>>>> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache > >>>> feather logo, the Apache Logging project logo, > >>>>>> + and the Apache Log4j logo are trademarks of The Apache > >>>> Software Foundation.</p>]]></bottom> > >>>>>> + <!-- module link generation is completely broken in the > >>>> javadoc plugin for a multi-module non-aggregating project --> > >>>>>> + <detectOfflineLinks>false</detectOfflineLinks> > >>>>>> + <linksource>true</linksource> > >>>>>> + </configuration> > >>>>>> + <reportSets> > >>>>>> + <reportSet> > >>>>>> + <id>non-aggregate</id> > >>>>>> + <reports> > >>>>>> + <report>javadoc</report> > >>>>>> + </reports> > >>>>>> + </reportSet> > >>>>>> + </reportSets> > >>>>>> + </plugin> > >>>>>> + <plugin> > >>>>>> + <groupId>org.codehaus.mojo</groupId> > >>>>>> + <artifactId>findbugs-maven-plugin</artifactId> > >>>>>> + <version>${findbugs.plugin.version}</version> > >>>>>> + <configuration> > >>>>>> + <fork>true</fork> > >>>>>> + <jvmArgs>-Duser.language=en</jvmArgs> > >>>>>> + <threshold>Normal</threshold> > >>>>>> + <effort>Default</effort> > >>>>>> + <excludeFilterFile>${log4jParentDir}/findbugs- > >>>> exclude-filter.xml</excludeFilterFile> > >>>>>> + </configuration> > >>>>>> + </plugin> > >>>>>> + <plugin> > >>>>>> + <groupId>org.apache.maven.plugins</groupId> > >>>>>> + <artifactId>maven-jxr-plugin</artifactId> > >>>>>> + <version>${jxr.plugin.version}</version> > >>>>>> + <reportSets> > >>>>>> + <reportSet> > >>>>>> + <id>non-aggregate</id> > >>>>>> + <reports> > >>>>>> + <report>jxr</report> > >>>>>> + </reports> > >>>>>> + </reportSet> > >>>>>> + <reportSet> > >>>>>> + <id>aggregate</id> > >>>>>> + <reports> > >>>>>> + <report>aggregate</report> > >>>>>> + </reports> > >>>>>> + </reportSet> > >>>>>> + </reportSets> > >>>>>> + </plugin> > >>>>>> + <plugin> > >>>>>> + <groupId>org.apache.maven.plugins</groupId> > >>>>>> + <artifactId>maven-pmd-plugin</artifactId> > >>>>>> + <version>${pmd.plugin.version}</version> > >>>>>> + <configuration> > >>>>>> + <targetJdk>${maven.compiler.target}</targetJdk> > >>>>>> + </configuration> > >>>>>> + </plugin> > >>>>>> + </plugins> > >>>>>> + </reporting> > >>>>>> +</project> > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/ > >>>> log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/log4j-jdbc-dbcp2/src/main/ > java/org/apache/logging/log4j/ > >>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java > >>>> b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/ > >>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java > >>>>>> new file mode 100644 > >>>>>> index 0000000..80adbb3 > >>>>>> --- /dev/null > >>>>>> +++ b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/ > >>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java > >>>>>> @@ -0,0 +1,155 @@ > >>>>>> +/* > >>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or > more > >>>>>> + * contributor license agreements. See the NOTICE file distributed > >> with > >>>>>> + * this work for additional information regarding copyright > >> ownership. > >>>>>> + * The ASF licenses this file to You under the Apache license, > >> Version > >>>> 2.0 > >>>>>> + * (the "License"); you may not use this file except in compliance > >> with > >>>>>> + * the License. You may obtain a copy of the License at > >>>>>> + * > >>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 > >>>>>> + * > >>>>>> + * Unless required by applicable law or agreed to in writing, > >> software > >>>>>> + * distributed under the License is distributed on an "AS IS" > BASIS, > >>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >>>> implied. > >>>>>> + * See the license for the specific language governing permissions > >> and > >>>>>> + * limitations under the license. > >>>>>> + */ > >>>>>> +package org.apache.logging.log4j.core.appender.db.jdbc; > >>>>>> + > >>>>>> +import java.sql.DriverManager; > >>>>>> +import java.sql.SQLException; > >>>>>> + > >>>>>> +import org.apache.commons.dbcp2.ConnectionFactory; > >>>>>> +import org.apache.commons.dbcp2.DriverManagerConnectionFactory; > >>>>>> +import org.apache.commons.dbcp2.PoolableConnection; > >>>>>> +import org.apache.commons.dbcp2.PoolableConnectionFactory; > >>>>>> +import org.apache.commons.dbcp2.PoolingDriver; > >>>>>> +import org.apache.commons.pool2.ObjectPool; > >>>>>> +import org.apache.commons.pool2.impl.GenericObjectPool; > >>>>>> +import org.apache.logging.log4j.core.Core; > >>>>>> +import org.apache.logging.log4j.core.config.Property; > >>>>>> +import org.apache.logging.log4j.core.config.plugins.Plugin; > >>>>>> +import org.apache.logging.log4j.core.config.plugins. > >>>> PluginBuilderFactory; > >>>>>> + > >>>>>> +/** > >>>>>> + * A {@link ConnectionSource} that uses a JDBC connection string, a > >>>> user name, and a password to call > >>>>>> + * {@link DriverManager#getConnection(String, String, String)}. > The > >>>> connections are served from an > >>>>>> + * <a href="http://commons.apache.org/proper/commons-dbcp/">Apache > >>>> Commons DBCP</a> pooling driver. > >>>>>> + */ > >>>>>> +@Plugin(name = "PoolingDriver", category = Core.CATEGORY_NAME, > >>>> elementType = "connectionSource", printObject = true) > >>>>>> +public final class PoolingDriverConnectionSource extends > >>>> DriverManagerConnectionSource { > >>>>>> + > >>>>>> + /** > >>>>>> + * Builds PoolingDriverConnectionSource instances. > >>>>>> + * > >>>>>> + * @param <B> > >>>>>> + * This builder type or a subclass. > >>>>>> + */ > >>>>>> + public static class Builder<B extends Builder<B>> > >>>>>> + extends DriverManagerConnectionSource.Builder<B, > >>>> PoolingDriverConnectionSource> { > >>>>>> + > >>>>>> + public static final String DEFAULT_POOL_NAME = "example"; > >>>>>> + private String poolName = DEFAULT_POOL_NAME; > >>>>>> + > >>>>>> + @Override > >>>>>> + public PoolingDriverConnectionSource build() { > >>>>>> + try { > >>>>>> + return new PoolingDriverConnectionSource( > >> getDriverClassName(), > >>>> getConnectionString(), getUserName(), > >>>>>> + getPassword(), getProperties(), poolName); > >>>>>> + } catch (final SQLException e) { > >>>>>> + getLogger().error("Exception constructing {} for > {}", > >>>> PoolingDriverConnectionSource.class, > >>>>>> + getConnectionString(), e); > >>>>>> + return null; > >>>>>> + } > >>>>>> + } > >>>>>> + > >>>>>> + public B setPoolName(final String poolName) { > >>>>>> + this.poolName = poolName; > >>>>>> + return asBuilder(); > >>>>>> + } > >>>>>> + } > >>>>>> + > >>>>>> + public static final String URL_PREFIX = > >>>> "jdbc:apache:commons:dbcp:"; > >>>>>> + > >>>>>> + // This method is not named newBuilder() to make the compiler > >>>> happy. > >>>>>> + @PluginBuilderFactory > >>>>>> + public static <B extends Builder<B>> B > >>>> newPoolingDriverConnectionSourceBuilder() { > >>>>>> + return new Builder<B>().asBuilder(); > >>>>>> + } > >>>>>> + > >>>>>> + private final String poolingDriverClassName = > >>>> "org.apache.commons.dbcp2.PoolingDriver"; > >>>>>> + > >>>>>> + private final String poolName; > >>>>>> + > >>>>>> + public PoolingDriverConnectionSource(final String > >>>> driverClassName, final String connectionString, > >>>>>> + final char[] userName, final char[] password, final > >>>> Property[] properties, final String poolName) > >>>>>> + throws SQLException { > >>>>>> + super(driverClassName, connectionString, URL_PREFIX + > >>>> poolName, userName, password, properties); > >>>>>> + this.poolName = poolName; > >>>>>> + setupDriver(connectionString); > >>>>>> + } > >>>>>> + > >>>>>> + @Override > >>>>>> + public String getActualConnectionString() { > >>>>>> + // TODO Auto-generated method stub > >>>>>> + return super.getActualConnectionString(); > >>>>>> + } > >>>>>> + > >>>>>> + private PoolingDriver getPoolingDriver() throws SQLException { > >>>>>> + final PoolingDriver driver = (PoolingDriver) > >>>> DriverManager.getDriver(URL_PREFIX); > >>>>>> + if (driver == null) { > >>>>>> + getLogger().error("No JDBC driver for {}", URL_PREFIX); > >>>>>> + } > >>>>>> + return driver; > >>>>>> + } > >>>>>> + > >>>>>> + private void setupDriver(final String connectionString) throws > >>>> SQLException { > >>>>>> + // > >>>>>> + // First, we'll create a ConnectionFactory that the > >>>>>> + // pool will use to create Connections. > >>>>>> + // We'll use the DriverManagerConnectionFactory, > >>>>>> + // using the connect string passed in the command line > >>>>>> + // arguments. > >>>>>> + // > >>>>>> + final ConnectionFactory connectionFactory = new > >>>> DriverManagerConnectionFactory(connectionString, null); > >>>>>> + > >>>>>> + // > >>>>>> + // Next, we'll create the PoolableConnectionFactory, which > >>>> wraps > >>>>>> + // the "real" Connections created by the ConnectionFactory > >> with > >>>>>> + // the classes that implement the pooling functionality. > >>>>>> + // > >>>>>> + final PoolableConnectionFactory poolableConnectionFactory = > >>>> new PoolableConnectionFactory(connectionFactory, > >>>>>> + null); > >>>>>> + > >>>>>> + // > >>>>>> + // Now we'll need a ObjectPool that serves as the > >>>>>> + // actual pool of connections. > >>>>>> + // > >>>>>> + // We'll use a GenericObjectPool instance, although > >>>>>> + // any ObjectPool implementation will suffice. > >>>>>> + // > >>>>>> + @SuppressWarnings("resource") > >>>>>> + // This GenericObjectPool will be closed on shutown > >>>>>> + final ObjectPool<PoolableConnection> connectionPool = new > >>>> GenericObjectPool<>(poolableConnectionFactory); > >>>>>> + > >>>>>> + // Set the factory's pool property to the owning pool > >>>>>> + poolableConnectionFactory.setPool(connectionPool); > >>>>>> + > >>>>>> + loadDriver(poolingDriverClassName); > >>>>>> + final PoolingDriver driver = getPoolingDriver(); > >>>>>> + if (driver != null) { > >>>>>> + driver.registerPool(poolName, connectionPool); > >>>>>> + } > >>>>>> + // > >>>>>> + // Now we can just use the connect string > >>>> "jdbc:apache:commons:dbcp:example" > >>>>>> + // to access our pool of Connections. > >>>>>> + // > >>>>>> + } > >>>>>> + > >>>>>> + public void shutdownDriver() throws SQLException { > >>>>>> + final PoolingDriver driver = getPoolingDriver(); > >>>>>> + if (driver != null) { > >>>>>> + driver.closePool(poolName); > >>>>>> + } > >>>>>> + } > >>>>>> +} > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/log4j-jdbc-dbcp2/src/site/manual/index.md > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/log4j-jdbc-dbcp2/src/site/manual/index.md > >>>> b/log4j-jdbc-dbcp2/src/site/manual/index.md > >>>>>> new file mode 100644 > >>>>>> index 0000000..b7fb5a5 > >>>>>> --- /dev/null > >>>>>> +++ b/log4j-jdbc-dbcp2/src/site/manual/index.md > >>>>>> @@ -0,0 +1,35 @@ > >>>>>> +<!-- vim: set syn=markdown : --> > >>>>>> +<!-- > >>>>>> + Licensed to the Apache Software Foundation (ASF) under one or > >> more > >>>>>> + contributor license agreements. See the NOTICE file > distributed > >>>> with > >>>>>> + this work for additional information regarding copyright > >> ownership. > >>>>>> + The ASF licenses this file to You under the Apache License, > >>>> Version 2.0 > >>>>>> + (the "License"); you may not use this file except in compliance > >>>> with > >>>>>> + the License. You may obtain a copy of the License at > >>>>>> + > >>>>>> + http://www.apache.org/licenses/LICENSE-2.0 > >>>>>> + > >>>>>> + Unless required by applicable law or agreed to in writing, > >> software > >>>>>> + distributed under the License is distributed on an "AS IS" > BASIS, > >>>>>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >>>> implied. > >>>>>> + See the License for the specific language governing permissions > >> and > >>>>>> + limitations under the License. > >>>>>> +--> > >>>>>> + > >>>>>> +# Log4j 2 JDBC Connection Source with Apache Commons DBCP 2 > >>>>>> + > >>>>>> +This module adds a connection source for JDBC Appenders. The > >>>> PoolingDriverConnectionSource > >>>>>> +provides connection pooling through Apache Commons DBCP 2. > >>>>>> + > >>>>>> +## Requirements > >>>>>> + > >>>>>> +This module was introduced in Log4j 2.11.0 and requires Apache > >> Commons > >>>> DBCP 2 to provide > >>>>>> +connection pooling. > >>>>>> + > >>>>>> +Some features may require optional > >>>>>> +[dependencies](../runtime-dependencies.html). These dependencies > are > >>>> specified in the > >>>>>> +documentation for those features. > >>>>>> + > >>>>>> +Some Log4j features require external dependencies. > >>>>>> +See the [Dependency Tree](dependencies.html#Dependency_Tree) > >>>>>> +for the exact list of JAR files needed for these features. > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/log4j-jdbc-dbcp2/src/site/site.xml > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/log4j-jdbc-dbcp2/src/site/site.xml > >>>> b/log4j-jdbc-dbcp2/src/site/site.xml > >>>>>> new file mode 100644 > >>>>>> index 0000000..6d4cddc > >>>>>> --- /dev/null > >>>>>> +++ b/log4j-jdbc-dbcp2/src/site/site.xml > >>>>>> @@ -0,0 +1,52 @@ > >>>>>> +<!-- > >>>>>> + Licensed to the Apache Software Foundation (ASF) under one or more > >>>>>> + contributor license agreements. See the NOTICE file distributed > >> with > >>>>>> + this work for additional information regarding copyright > ownership. > >>>>>> + The ASF licenses this file to You under the Apache License, > Version > >>>> 2.0 > >>>>>> + (the "License"); you may not use this file except in compliance > with > >>>>>> + the License. You may obtain a copy of the License at > >>>>>> + > >>>>>> + http://www.apache.org/licenses/LICENSE-2.0 > >>>>>> + > >>>>>> + Unless required by applicable law or agreed to in writing, > software > >>>>>> + distributed under the License is distributed on an "AS IS" BASIS, > >>>>>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >>>> implied. > >>>>>> + See the License for the specific language governing permissions > and > >>>>>> + limitations under the License. > >>>>>> + > >>>>>> +--> > >>>>>> +<project name="Log4j Core" > >>>>>> + xmlns="http://maven.apache.org/DECORATION/1.4.0" > >>>>>> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > >>>>>> + xsi:schemaLocation="http://maven.apache.org/DECORATION/1. > >> 4.0 > >>>> http://maven.apache.org/xsd/decoration-1.4.0.xsd"> > >>>>>> + <body> > >>>>>> + <links> > >>>>>> + <item name="Apache" href="http://www.apache.org/" /> > >>>>>> + <item name="Logging Services" href="http://logging.apache. > org/ > >>>> "/> > >>>>>> + <item name="Log4j" href="../index.html"/> > >>>>>> + </links> > >>>>>> + > >>>>>> + <!-- Component-specific reports --> > >>>>>> + <menu ref="reports"/> > >>>>>> + > >>>>>> + <!-- Overall Project Info --> > >>>>>> + <menu name="Log4j Project Information" img="icon-info-sign"> > >>>>>> + <item name="Dependencies" href="../dependencies.html" /> > >>>>>> + <item name="Dependency Convergence" href="../dependency- > >> convergence.html" > >>>> /> > >>>>>> + <item name="Dependency Management" href="../dependency- > >> management.html" > >>>> /> > >>>>>> + <item name="Project Team" href="../team-list.html" /> > >>>>>> + <item name="Mailing Lists" href="../mail-lists.html" /> > >>>>>> + <item name="Issue Tracking" href="../issue-tracking.html" /> > >>>>>> + <item name="Project License" href="../license.html" /> > >>>>>> + <item name="Source Repository" href="../source-repository. > >> html" > >>>> /> > >>>>>> + <item name="Project Summary" href="../project-summary.html" > /> > >>>>>> + </menu> > >>>>>> + > >>>>>> + <menu name="Log4j Project Reports" img="icon-cog"> > >>>>>> + <item name="Changes Report" href="../changes-report.html" /> > >>>>>> + <item name="JIRA Report" href="../jira-report.html" /> > >>>>>> + <item name="Surefire Report" href="../surefire-report.html" > /> > >>>>>> + <item name="RAT Report" href="../rat-report.html" /> > >>>>>> + </menu> > >>>>>> + </body> > >>>>>> +</project> > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/ > >>>> log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/log4j-jdbc-dbcp2/src/test/ > java/org/apache/logging/log4j/ > >>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java > >>>> b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/ > >>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java > >>>>>> new file mode 100644 > >>>>>> index 0000000..2b7b886 > >>>>>> --- /dev/null > >>>>>> +++ b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/ > >>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java > >>>>>> @@ -0,0 +1,96 @@ > >>>>>> +/* > >>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or > more > >>>>>> + * contributor license agreements. See the NOTICE file distributed > >> with > >>>>>> + * this work for additional information regarding copyright > >> ownership. > >>>>>> + * The ASF licenses this file to You under the Apache license, > >> Version > >>>> 2.0 > >>>>>> + * (the "License"); you may not use this file except in compliance > >> with > >>>>>> + * the License. You may obtain a copy of the License at > >>>>>> + * > >>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 > >>>>>> + * > >>>>>> + * Unless required by applicable law or agreed to in writing, > >> software > >>>>>> + * distributed under the License is distributed on an "AS IS" > BASIS, > >>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >>>> implied. > >>>>>> + * See the license for the specific language governing permissions > >> and > >>>>>> + * limitations under the license. > >>>>>> + */ > >>>>>> + > >>>>>> +package org.apache.logging.log4j.core.appender.db.jdbc; > >>>>>> + > >>>>>> +import java.sql.Connection; > >>>>>> +import java.sql.SQLException; > >>>>>> + > >>>>>> +import org.apache.logging.log4j.core.config.Property; > >>>>>> +import org.junit.Assert; > >>>>>> +import org.junit.Test; > >>>>>> + > >>>>>> +public class PoolingDriverConnectionSourceTest { > >>>>>> + > >>>>>> + @Test > >>>>>> + public void testH2Properties() throws SQLException { > >>>>>> + final Property[] properties = new Property[] { > >>>>>> + // @formatter:off > >>>>>> + Property.createProperty("username", > >>>> JdbcH2TestHelper.USER_NAME), > >>>>>> + Property.createProperty("password", > >>>> JdbcH2TestHelper.PASSWORD), > >>>>>> + // @formatter:on > >>>>>> + }; > >>>>>> + // @formatter:off > >>>>>> + final PoolingDriverConnectionSource source = > >>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour > ceBuilder() > >>>>>> + .setConnectionString(JdbcH2TestHelper.CONNECTION_ > STRING) > >>>>>> + .setProperties(properties) > >>>>>> + .build(); > >>>>>> + // @formatter:on > >>>>>> + try (Connection conn = source.getConnection()) { > >>>>>> + Assert.assertFalse(conn.isClosed()); > >>>>>> + } > >>>>>> + } > >>>>>> + > >>>>>> + @Test > >>>>>> + public void testH2PropertiesAndPoolName() throws SQLException { > >>>>>> + final Property[] properties = new Property[] { > >>>>>> + // @formatter:off > >>>>>> + Property.createProperty("username", > >>>> JdbcH2TestHelper.USER_NAME), > >>>>>> + Property.createProperty("password", > >>>> JdbcH2TestHelper.PASSWORD), > >>>>>> + // @formatter:on > >>>>>> + }; > >>>>>> + // @formatter:off > >>>>>> + final PoolingDriverConnectionSource source = > >>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour > ceBuilder() > >>>>>> + .setConnectionString(JdbcH2TestHelper.CONNECTION_ > STRING) > >>>>>> + .setProperties(properties) > >>>>>> + .setPoolName("MyPoolName") > >>>>>> + .build(); > >>>>>> + // @formatter:on > >>>>>> + try (Connection conn = source.getConnection()) { > >>>>>> + Assert.assertFalse(conn.isClosed()); > >>>>>> + } > >>>>>> + } > >>>>>> + > >>>>>> + @Test > >>>>>> + public void testH2UserAndPassword() throws SQLException { > >>>>>> + // @formatter:off > >>>>>> + final PoolingDriverConnectionSource source = > >>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour > ceBuilder() > >>>>>> + .setConnectionString(JdbcH2TestHelper.CONNECTION_ > STRING) > >>>>>> + .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray()) > >>>>>> + .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray()) > >>>>>> + .build(); > >>>>>> + // @formatter:on > >>>>>> + try (Connection conn = source.getConnection()) { > >>>>>> + Assert.assertFalse(conn.isClosed()); > >>>>>> + } > >>>>>> + } > >>>>>> + > >>>>>> + @Test > >>>>>> + public void testH2UserPasswordAndPoolName() throws > SQLException > >> { > >>>>>> + // @formatter:off > >>>>>> + final PoolingDriverConnectionSource source = > >>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour > ceBuilder() > >>>>>> + .setConnectionString(JdbcH2TestHelper.CONNECTION_ > STRING) > >>>>>> + .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray()) > >>>>>> + .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray()) > >>>>>> + .setPoolName("MyPoolName") > >>>>>> + .build(); > >>>>>> + // @formatter:on > >>>>>> + try (Connection conn = source.getConnection()) { > >>>>>> + Assert.assertFalse(conn.isClosed()); > >>>>>> + } > >>>>>> + } > >>>>>> +} > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/pom.xml > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/pom.xml b/pom.xml > >>>>>> index 31195f2..f1027f2 100644 > >>>>>> --- a/pom.xml > >>>>>> +++ b/pom.xml > >>>>>> @@ -1320,6 +1320,7 @@ > >>>>>> <module>log4j-jmx-gui</module> > >>>>>> <module>log4j-samples</module> > >>>>>> <module>log4j-bom</module> > >>>>>> + <module>log4j-jdbc-dbcp2</module> > >>>>>> <module>log4j-couchdb</module> > >>>>>> <module>log4j-mongodb</module> > >>>>>> <module>log4j-cassandra</module> > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/src/changes/changes.xml > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml > >>>>>> index 3ca94e4..6398bb0 100644 > >>>>>> --- a/src/changes/changes.xml > >>>>>> +++ b/src/changes/changes.xml > >>>>>> @@ -104,6 +104,9 @@ > >>>>>> <action issue="LOG4J2-2198" dev="ggregory" type="update"> > >>>>>> Update MongoDB dependencies from classic to modern. > >>>>>> </action> > >>>>>> + <action issue="LOG4J2-2186" dev="ggregory" type="add"> > >>>>>> + Add a JDBC ConnectionSource that provides pooling through > >>>> Apache Commons DBCP 2. > >>>>>> + </action> > >>>>>> </release> > >>>>>> <release version="2.10.0" date="2017-11-18" description="GA Release > >>>> 2.10.0"> > >>>>>> <action issue="LOG4J2-2120" dev="mikes" type="add" due-to="Carter > >>>> Douglas Kozak "> > >>>>>> > >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ > >>>> 639f093b/src/site/xdoc/manual/appenders.xml > >>>>>> ------------------------------------------------------------ > >> ---------- > >>>>>> diff --git a/src/site/xdoc/manual/appenders.xml > >> b/src/site/xdoc/manual/ > >>>> appenders.xml > >>>>>> index c62a284..4f106df 100644 > >>>>>> --- a/src/site/xdoc/manual/appenders.xml > >>>>>> +++ b/src/site/xdoc/manual/appenders.xml > >>>>>> @@ -1070,9 +1070,10 @@ CREATE TABLE logs ( > >>>>>> <p>When configuring the JDBCAppender, you must specify a > >>>> <code>ConnectionSource</code> implementation from > >>>>>> which the Appender gets JDBC connections. You must use > >>>> exactly one of the following nested elements:</p> > >>>>>> <ul> > >>>>>> - <li><a href="#JDBCDataSource"><code>& > >>>> lt;DataSource></code></a></li> > >>>>>> - <li><a href="#JDBCConnectionFactory"> > >>>> <code><ConnectionFactory></code></a></li> > >>>>>> - <li><a href="#JDBCDriverManager">< > >>>> code><DriverManager></code></a></li> > >>>>>> + <li><a href="#JDBCDataSource"><code>& > >> lt;DataSource></code></a>: > >>>> Uses JNDI.</li> > >>>>>> + <li><a href="#JDBCConnectionFactory"> > >>>> <code><ConnectionFactory></code></a>: Points to a class-method > >> pair > >>>> to provide JDBC connections.</li> > >>>>>> + <li><a href="#JDBCDriverManager">< > >>>> code><DriverManager></code></a>: A quick and dirty way to get > off > >>>> the ground, no connection pooling.</li> > >>>>>> + <li><a href="#JDBCPoolingDriver">< > >>>> code><PoolingDriver></code></a>: Uses Apache Commons DBCP to > >>>> provide connection pooling.</li> > >>>>>> </ul> > >>>>>> <a name="JDBCDataSource"/> > >>>>>> <table> > >>>>>> @@ -1149,6 +1150,27 @@ CREATE TABLE logs ( > >>>>>> <td>A list of properties. You cannot specify both > >>>> properties and a user name or password.</td> > >>>>>> </tr> > >>>>>> </table> > >>>>>> + <a name="JDBCPoolingDriver"/> > >>>>>> + <table> > >>>>>> + <caption align="top">PoolingDriver Parameters (Apache > >>>> Commons DBCP)</caption> > >>>>>> + <tr> > >>>>>> + <th>Parameter Name</th> > >>>>>> + <th>Type</th> > >>>>>> + <th>Description</th> > >>>>>> + </tr> > >>>>>> + <tr> > >>>>>> + <td>DriverManager parameters</td> > >>>>>> + <td>DriverManager parameters</td> > >>>>>> + <td>This connection source inherits all parameter > from > >>>> the DriverManager connection source.</td> > >>>>>> + </tr> > >>>>>> + <tr> > >>>>>> + <td>poolName</td> > >>>>>> + <td>String</td> > >>>>>> + <td>The pool name used to pool JDBC Connections. > >>>> Defaults to <code>example</code>. You can use the JDBC > >>>>>> + connection string prefix <code>jdbc:apache:commons: > >> dbcp:</code> > >>>> followed by the pool name if you want > >>>>>> + to use a pooled connection elsewhere. For example: > >>>> <code>jdbc:apache:commons:dbcp:example</code>.</td> > >>>>>> + </tr> > >>>>>> + </table> > >>>>>> <p>When configuring the JDBCAppender, use the nested > >>>> <code><Column></code> elements to specify which > >>>>>> columns in the table should be written to and how to write > >>>> to them. The JDBCAppender uses this information > >>>>>> to formulate a <code>PreparedStatement</code> to insert > >>>> records without SQL injection vulnerability.</p> > >>>>>> > >>>>>> > >>>>> > >>>>> > >>>>> > >>>> > >>>> > >>>> > >> > >> > >> > > > > -- Matt Sicker <boa...@gmail.com>