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.newPoolingDriverConnectionSourceBuilder() > >>>> + .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.newPoolingDriverConnectionSourceBuilder() > >>>> + .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.newPoolingDriverConnectionSourceBuilder() > >>>> + .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.newPoolingDriverConnectionSourceBuilder() > >>>> + .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> > >>>> > >>>> > >>> > >>> > >>> > >> > >> > >> > > >