OK, but that doesn’t resolve the initial problem. The log4j 2 project is too large.
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><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> >>>> >>>> >>> >>> >>> >> >> >>