JUnit 5 might have something more extensible there, though it does require Java 8 (at least for the test artifacts). I'm not sure either as I've mostly been using other testing frameworks when not using JUnit 4.
On 19 January 2018 at 21:19, Remko Popma <remko.po...@gmail.com> wrote: > Reducing the time it takes to run the core tests is key. > > It would be great if we could specify which tests should be forked, and > run the rest non-forked. Perhaps we need to enhance Surefire. Or can JUnit > 5 help somehow (haven’t looked at it yet)? > > Remko > > (Shameless plug) Every java main() method deserves http://picocli.info > > > On Jan 20, 2018, at 8:21, Matt Sicker <boa...@gmail.com> wrote: > > > > 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</modu > le.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> > > -- Matt Sicker <boa...@gmail.com>