Gary, I am complaining because I perform the releases. You never have. We keep adding more and more crap to the build and it keeps taking longer and longer. Af far as I am concerned that is a valid technical reason.
My -1 stands. Ralph > On Jan 18, 2018, at 10:24 PM, Gary Gregory <garydgreg...@gmail.com> wrote: > > On Thu, Jan 18, 2018 at 10:20 PM, Ralph Goers <ralph.go...@dslextreme.com> > wrote: > >> OK, but that doesn’t resolve the initial problem. The log4j 2 project is >> too large. >> > > From what I've experienced, folks complain about the size of the api and > core jars, not the Maven project. > > What is the target size/metric if it is currently "too large"? ;-) > > Gary > > >> Ralph >> >>> On Jan 18, 2018, at 10:15 PM, Gary Gregory <garydgreg...@gmail.com> >> wrote: >>> >>> On Thu, Jan 18, 2018 at 9:43 PM, Ralph Goers <ralph.go...@dslextreme.com >>> >>> wrote: >>> >>>> In addition, the build is now failing to compile on Jenkins. >>>> >>> >>> Oops, please accept my apologies. I got caught by the Eclipse compiler >>> being more forgiving (or more powerful) than the Oracle compiler in the >>> generics department. All of that despite the Maven partial builds I ran. >> I >>> must have not run the clean goal or some-such. >>> >>> Gary >>> >>> >>>> Ralph >>>> >>>>> On Jan 18, 2018, at 9:28 PM, Ralph Goers <ralph.go...@dslextreme.com> >>>> wrote: >>>>> >>>>> -1 >>>>> >>>>> Please revert and move this to the log4j plugins project. >>>>> >>>>> Ralph >>>>> >>>>>> On Jan 18, 2018, at 8:54 PM, ggreg...@apache.org wrote: >>>>>> >>>>>> Repository: logging-log4j2 >>>>>> Updated Branches: >>>>>> refs/heads/master bb6fcd09e -> 639f093b8 >>>>>> >>>>>> >>>>>> [LOG4J2-2186] Add a JDBC ConnectionSource that provides pooling >> through >>>>>> Apache Commons DBCP 2. >>>>>> >>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>>>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/ >>>> commit/639f093b >>>>>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ >>>> 639f093b >>>>>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ >>>> 639f093b >>>>>> >>>>>> Branch: refs/heads/master >>>>>> Commit: 639f093b8103df2c2eda8d62fd12d7619d98ac04 >>>>>> Parents: bb6fcd0 >>>>>> Author: Gary Gregory <garydgreg...@gmail.com> >>>>>> Authored: Thu Jan 18 20:54:47 2018 -0700 >>>>>> Committer: Gary Gregory <garydgreg...@gmail.com> >>>>>> Committed: Thu Jan 18 20:54:47 2018 -0700 >>>>>> >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> log4j-jdbc-dbcp2/pom.xml | 170 >>>> +++++++++++++++++++ >>>>>> .../db/jdbc/PoolingDriverConnectionSource.java | 155 >> +++++++++++++++++ >>>>>> log4j-jdbc-dbcp2/src/site/manual/index.md | 35 ++++ >>>>>> log4j-jdbc-dbcp2/src/site/site.xml | 52 ++++++ >>>>>> .../jdbc/PoolingDriverConnectionSourceTest.java | 96 +++++++++++ >>>>>> pom.xml | 1 + >>>>>> src/changes/changes.xml | 3 + >>>>>> src/site/xdoc/manual/appenders.xml | 28 ++- >>>>>> 8 files changed, 537 insertions(+), 3 deletions(-) >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> >>>>>> >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >>>> 639f093b/log4j-jdbc-dbcp2/pom.xml >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> diff --git a/log4j-jdbc-dbcp2/pom.xml b/log4j-jdbc-dbcp2/pom.xml >>>>>> new file mode 100644 >>>>>> index 0000000..18e0e86 >>>>>> --- /dev/null >>>>>> +++ b/log4j-jdbc-dbcp2/pom.xml >>>>>> @@ -0,0 +1,170 @@ >>>>>> +<?xml version="1.0" encoding="UTF-8"?> >>>>>> +<!-- ~ Licensed to the Apache Software Foundation (ASF) under one or >>>> more ~ contributor license agreements. See the NOTICE >>>>>> + file distributed with ~ this work for additional information >>>> regarding copyright ownership. ~ The ASF licenses this file >>>>>> + to You under the Apache License, Version 2.0 ~ (the "License"); you >>>> may not use this file except in compliance with ~ the >>>>>> + License. You may obtain a copy of the License at ~ ~ >>>> http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by >>>> applicable >>>>>> + law or agreed to in writing, software ~ distributed under the >>>> License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES >>>>>> + OR CONDITIONS OF ANY KIND, either express or implied. ~ See the >>>> License for the specific language governing permissions and >>>>>> + ~ limitations under the License. --> >>>>>> + >>>>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" >>>> http://www.w3.org/2001/XMLSchema-instance" >>>>>> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 >>>> http://maven.apache.org/xsd/maven-4.0.0.xsd"> >>>>>> + <parent> >>>>>> + <groupId>org.apache.logging.log4j</groupId> >>>>>> + <artifactId>log4j</artifactId> >>>>>> + <version>2.10.1-SNAPSHOT</version> >>>>>> + </parent> >>>>>> + <modelVersion>4.0.0</modelVersion> >>>>>> + >>>>>> + <artifactId>log4j-jdbc-dbcp2</artifactId> >>>>>> + <name>Apache Log4j JDBC DBCP 2</name> >>>>>> + <description> >>>>>> + Connection source for the JDBC Appender using on Apache Commons >>>> DBCP 2. >>>>>> + </description> >>>>>> + <properties> >>>>>> + <log4jParentDir>${basedir}/..</log4jParentDir> >>>>>> + <docLabel>Log4j JDBC DBCP 2 Documentation</docLabel> >>>>>> + <projectDir>/log4j-jdbc-dbcp2</projectDir> >>>>>> + <module.name>org.apache.logging.log4j.jdbc.dbcp2</module.name> >>>>>> + </properties> >>>>>> + >>>>>> + <dependencies> >>>>>> + <dependency> >>>>>> + <groupId>org.apache.logging.log4j</groupId> >>>>>> + <artifactId>log4j-core</artifactId> >>>>>> + </dependency> >>>>>> + <dependency> >>>>>> + <groupId>org.apache.commons</groupId> >>>>>> + <artifactId>commons-dbcp2</artifactId> >>>>>> + <version>2.2.0</version> >>>>>> + </dependency> >>>>>> + <!-- Test Dependencies --> >>>>>> + <dependency> >>>>>> + <groupId>junit</groupId> >>>>>> + <artifactId>junit</artifactId> >>>>>> + </dependency> >>>>>> + <dependency> >>>>>> + <groupId>org.apache.logging.log4j</groupId> >>>>>> + <artifactId>log4j-api</artifactId> >>>>>> + <type>test-jar</type> >>>>>> + </dependency> >>>>>> + <dependency> >>>>>> + <groupId>org.apache.logging.log4j</groupId> >>>>>> + <artifactId>log4j-core</artifactId> >>>>>> + <type>test-jar</type> >>>>>> + </dependency> >>>>>> + <dependency> >>>>>> + <groupId>com.h2database</groupId> >>>>>> + <artifactId>h2</artifactId> >>>>>> + <scope>test</scope> >>>>>> + </dependency> >>>>>> + </dependencies> >>>>>> + >>>>>> + <build> >>>>>> + <plugins> >>>>>> + <plugin> >>>>>> + <groupId>org.apache.felix</groupId> >>>>>> + <artifactId>maven-bundle-plugin</artifactId> >>>>>> + <configuration> >>>>>> + <instructions> >>>>>> + <Fragment-Host>org.apache.logging.log4j.core.appender. >>>> db.jdbc</Fragment-Host> >>>>>> + <Export-Package>*</Export-Package> >>>>>> + </instructions> >>>>>> + </configuration> >>>>>> + </plugin> >>>>>> + </plugins> >>>>>> + </build> >>>>>> + <reporting> >>>>>> + <plugins> >>>>>> + <plugin> >>>>>> + <groupId>org.apache.maven.plugins</groupId> >>>>>> + <artifactId>maven-changes-plugin</artifactId> >>>>>> + <version>${changes.plugin.version}</version> >>>>>> + <reportSets> >>>>>> + <reportSet> >>>>>> + <reports> >>>>>> + <report>changes-report</report> >>>>>> + </reports> >>>>>> + </reportSet> >>>>>> + </reportSets> >>>>>> + <configuration> >>>>>> + <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</ >>>> issueLinkTemplate> >>>>>> + <useJql>true</useJql> >>>>>> + </configuration> >>>>>> + </plugin> >>>>>> + <plugin> >>>>>> + <groupId>org.apache.maven.plugins</groupId> >>>>>> + <artifactId>maven-checkstyle-plugin</artifactId> >>>>>> + <version>${checkstyle.plugin.version}</version> >>>>>> + <configuration> >>>>>> + <!--<propertiesLocation>${vfs.parent.dir}/checkstyle. >>>> properties</propertiesLocation> --> >>>>>> + <configLocation>${log4jParentDir}/checkstyle. >>>> xml</configLocation> >>>>>> + <suppressionsLocation>${log4jParentDir}/checkstyle- >>>> suppressions.xml</suppressionsLocation> >>>>>> + <enableRulesSummary>false</enableRulesSummary> >>>>>> + <propertyExpansion>basedir=${basedir}</propertyExpansion> >>>>>> + <propertyExpansion>licensedir= >> ${log4jParentDir}/checkstyle- >>>> header.txt</propertyExpansion> >>>>>> + </configuration> >>>>>> + </plugin> >>>>>> + <plugin> >>>>>> + <groupId>org.apache.maven.plugins</groupId> >>>>>> + <artifactId>maven-javadoc-plugin</artifactId> >>>>>> + <version>${javadoc.plugin.version}</version> >>>>>> + <configuration> >>>>>> + <bottom><![CDATA[<p align="center">Copyright © >>>> {inceptionYear}-{currentYear} {organizationName}. All Rights >> Reserved.<br /> >>>>>> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache >>>> feather logo, the Apache Logging project logo, >>>>>> + and the Apache Log4j logo are trademarks of The Apache >>>> Software Foundation.</p>]]></bottom> >>>>>> + <!-- module link generation is completely broken in the >>>> javadoc plugin for a multi-module non-aggregating project --> >>>>>> + <detectOfflineLinks>false</detectOfflineLinks> >>>>>> + <linksource>true</linksource> >>>>>> + </configuration> >>>>>> + <reportSets> >>>>>> + <reportSet> >>>>>> + <id>non-aggregate</id> >>>>>> + <reports> >>>>>> + <report>javadoc</report> >>>>>> + </reports> >>>>>> + </reportSet> >>>>>> + </reportSets> >>>>>> + </plugin> >>>>>> + <plugin> >>>>>> + <groupId>org.codehaus.mojo</groupId> >>>>>> + <artifactId>findbugs-maven-plugin</artifactId> >>>>>> + <version>${findbugs.plugin.version}</version> >>>>>> + <configuration> >>>>>> + <fork>true</fork> >>>>>> + <jvmArgs>-Duser.language=en</jvmArgs> >>>>>> + <threshold>Normal</threshold> >>>>>> + <effort>Default</effort> >>>>>> + <excludeFilterFile>${log4jParentDir}/findbugs- >>>> exclude-filter.xml</excludeFilterFile> >>>>>> + </configuration> >>>>>> + </plugin> >>>>>> + <plugin> >>>>>> + <groupId>org.apache.maven.plugins</groupId> >>>>>> + <artifactId>maven-jxr-plugin</artifactId> >>>>>> + <version>${jxr.plugin.version}</version> >>>>>> + <reportSets> >>>>>> + <reportSet> >>>>>> + <id>non-aggregate</id> >>>>>> + <reports> >>>>>> + <report>jxr</report> >>>>>> + </reports> >>>>>> + </reportSet> >>>>>> + <reportSet> >>>>>> + <id>aggregate</id> >>>>>> + <reports> >>>>>> + <report>aggregate</report> >>>>>> + </reports> >>>>>> + </reportSet> >>>>>> + </reportSets> >>>>>> + </plugin> >>>>>> + <plugin> >>>>>> + <groupId>org.apache.maven.plugins</groupId> >>>>>> + <artifactId>maven-pmd-plugin</artifactId> >>>>>> + <version>${pmd.plugin.version}</version> >>>>>> + <configuration> >>>>>> + <targetJdk>${maven.compiler.target}</targetJdk> >>>>>> + </configuration> >>>>>> + </plugin> >>>>>> + </plugins> >>>>>> + </reporting> >>>>>> +</project> >>>>>> >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >>>> 639f093b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/ >>>> log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.java >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> diff --git a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/ >>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java >>>> b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/ >>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java >>>>>> new file mode 100644 >>>>>> index 0000000..80adbb3 >>>>>> --- /dev/null >>>>>> +++ b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/ >>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java >>>>>> @@ -0,0 +1,155 @@ >>>>>> +/* >>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more >>>>>> + * contributor license agreements. See the NOTICE file distributed >> with >>>>>> + * this work for additional information regarding copyright >> ownership. >>>>>> + * The ASF licenses this file to You under the Apache license, >> Version >>>> 2.0 >>>>>> + * (the "License"); you may not use this file except in compliance >> with >>>>>> + * the License. You may obtain a copy of the License at >>>>>> + * >>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 >>>>>> + * >>>>>> + * Unless required by applicable law or agreed to in writing, >> software >>>>>> + * distributed under the License is distributed on an "AS IS" BASIS, >>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>> implied. >>>>>> + * See the license for the specific language governing permissions >> and >>>>>> + * limitations under the license. >>>>>> + */ >>>>>> +package org.apache.logging.log4j.core.appender.db.jdbc; >>>>>> + >>>>>> +import java.sql.DriverManager; >>>>>> +import java.sql.SQLException; >>>>>> + >>>>>> +import org.apache.commons.dbcp2.ConnectionFactory; >>>>>> +import org.apache.commons.dbcp2.DriverManagerConnectionFactory; >>>>>> +import org.apache.commons.dbcp2.PoolableConnection; >>>>>> +import org.apache.commons.dbcp2.PoolableConnectionFactory; >>>>>> +import org.apache.commons.dbcp2.PoolingDriver; >>>>>> +import org.apache.commons.pool2.ObjectPool; >>>>>> +import org.apache.commons.pool2.impl.GenericObjectPool; >>>>>> +import org.apache.logging.log4j.core.Core; >>>>>> +import org.apache.logging.log4j.core.config.Property; >>>>>> +import org.apache.logging.log4j.core.config.plugins.Plugin; >>>>>> +import org.apache.logging.log4j.core.config.plugins. >>>> PluginBuilderFactory; >>>>>> + >>>>>> +/** >>>>>> + * A {@link ConnectionSource} that uses a JDBC connection string, a >>>> user name, and a password to call >>>>>> + * {@link DriverManager#getConnection(String, String, String)}. The >>>> connections are served from an >>>>>> + * <a href="http://commons.apache.org/proper/commons-dbcp/">Apache >>>> Commons DBCP</a> pooling driver. >>>>>> + */ >>>>>> +@Plugin(name = "PoolingDriver", category = Core.CATEGORY_NAME, >>>> elementType = "connectionSource", printObject = true) >>>>>> +public final class PoolingDriverConnectionSource extends >>>> DriverManagerConnectionSource { >>>>>> + >>>>>> + /** >>>>>> + * Builds PoolingDriverConnectionSource instances. >>>>>> + * >>>>>> + * @param <B> >>>>>> + * This builder type or a subclass. >>>>>> + */ >>>>>> + public static class Builder<B extends Builder<B>> >>>>>> + extends DriverManagerConnectionSource.Builder<B, >>>> PoolingDriverConnectionSource> { >>>>>> + >>>>>> + public static final String DEFAULT_POOL_NAME = "example"; >>>>>> + private String poolName = DEFAULT_POOL_NAME; >>>>>> + >>>>>> + @Override >>>>>> + public PoolingDriverConnectionSource build() { >>>>>> + try { >>>>>> + return new PoolingDriverConnectionSource( >> getDriverClassName(), >>>> getConnectionString(), getUserName(), >>>>>> + getPassword(), getProperties(), poolName); >>>>>> + } catch (final SQLException e) { >>>>>> + getLogger().error("Exception constructing {} for {}", >>>> PoolingDriverConnectionSource.class, >>>>>> + getConnectionString(), e); >>>>>> + return null; >>>>>> + } >>>>>> + } >>>>>> + >>>>>> + public B setPoolName(final String poolName) { >>>>>> + this.poolName = poolName; >>>>>> + return asBuilder(); >>>>>> + } >>>>>> + } >>>>>> + >>>>>> + public static final String URL_PREFIX = >>>> "jdbc:apache:commons:dbcp:"; >>>>>> + >>>>>> + // This method is not named newBuilder() to make the compiler >>>> happy. >>>>>> + @PluginBuilderFactory >>>>>> + public static <B extends Builder<B>> B >>>> newPoolingDriverConnectionSourceBuilder() { >>>>>> + return new Builder<B>().asBuilder(); >>>>>> + } >>>>>> + >>>>>> + private final String poolingDriverClassName = >>>> "org.apache.commons.dbcp2.PoolingDriver"; >>>>>> + >>>>>> + private final String poolName; >>>>>> + >>>>>> + public PoolingDriverConnectionSource(final String >>>> driverClassName, final String connectionString, >>>>>> + final char[] userName, final char[] password, final >>>> Property[] properties, final String poolName) >>>>>> + throws SQLException { >>>>>> + super(driverClassName, connectionString, URL_PREFIX + >>>> poolName, userName, password, properties); >>>>>> + this.poolName = poolName; >>>>>> + setupDriver(connectionString); >>>>>> + } >>>>>> + >>>>>> + @Override >>>>>> + public String getActualConnectionString() { >>>>>> + // TODO Auto-generated method stub >>>>>> + return super.getActualConnectionString(); >>>>>> + } >>>>>> + >>>>>> + private PoolingDriver getPoolingDriver() throws SQLException { >>>>>> + final PoolingDriver driver = (PoolingDriver) >>>> DriverManager.getDriver(URL_PREFIX); >>>>>> + if (driver == null) { >>>>>> + getLogger().error("No JDBC driver for {}", URL_PREFIX); >>>>>> + } >>>>>> + return driver; >>>>>> + } >>>>>> + >>>>>> + private void setupDriver(final String connectionString) throws >>>> SQLException { >>>>>> + // >>>>>> + // First, we'll create a ConnectionFactory that the >>>>>> + // pool will use to create Connections. >>>>>> + // We'll use the DriverManagerConnectionFactory, >>>>>> + // using the connect string passed in the command line >>>>>> + // arguments. >>>>>> + // >>>>>> + final ConnectionFactory connectionFactory = new >>>> DriverManagerConnectionFactory(connectionString, null); >>>>>> + >>>>>> + // >>>>>> + // Next, we'll create the PoolableConnectionFactory, which >>>> wraps >>>>>> + // the "real" Connections created by the ConnectionFactory >> with >>>>>> + // the classes that implement the pooling functionality. >>>>>> + // >>>>>> + final PoolableConnectionFactory poolableConnectionFactory = >>>> new PoolableConnectionFactory(connectionFactory, >>>>>> + null); >>>>>> + >>>>>> + // >>>>>> + // Now we'll need a ObjectPool that serves as the >>>>>> + // actual pool of connections. >>>>>> + // >>>>>> + // We'll use a GenericObjectPool instance, although >>>>>> + // any ObjectPool implementation will suffice. >>>>>> + // >>>>>> + @SuppressWarnings("resource") >>>>>> + // This GenericObjectPool will be closed on shutown >>>>>> + final ObjectPool<PoolableConnection> connectionPool = new >>>> GenericObjectPool<>(poolableConnectionFactory); >>>>>> + >>>>>> + // Set the factory's pool property to the owning pool >>>>>> + poolableConnectionFactory.setPool(connectionPool); >>>>>> + >>>>>> + loadDriver(poolingDriverClassName); >>>>>> + final PoolingDriver driver = getPoolingDriver(); >>>>>> + if (driver != null) { >>>>>> + driver.registerPool(poolName, connectionPool); >>>>>> + } >>>>>> + // >>>>>> + // Now we can just use the connect string >>>> "jdbc:apache:commons:dbcp:example" >>>>>> + // to access our pool of Connections. >>>>>> + // >>>>>> + } >>>>>> + >>>>>> + public void shutdownDriver() throws SQLException { >>>>>> + final PoolingDriver driver = getPoolingDriver(); >>>>>> + if (driver != null) { >>>>>> + driver.closePool(poolName); >>>>>> + } >>>>>> + } >>>>>> +} >>>>>> >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >>>> 639f093b/log4j-jdbc-dbcp2/src/site/manual/index.md >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> diff --git a/log4j-jdbc-dbcp2/src/site/manual/index.md >>>> b/log4j-jdbc-dbcp2/src/site/manual/index.md >>>>>> new file mode 100644 >>>>>> index 0000000..b7fb5a5 >>>>>> --- /dev/null >>>>>> +++ b/log4j-jdbc-dbcp2/src/site/manual/index.md >>>>>> @@ -0,0 +1,35 @@ >>>>>> +<!-- vim: set syn=markdown : --> >>>>>> +<!-- >>>>>> + Licensed to the Apache Software Foundation (ASF) under one or >> more >>>>>> + contributor license agreements. See the NOTICE file distributed >>>> with >>>>>> + this work for additional information regarding copyright >> ownership. >>>>>> + The ASF licenses this file to You under the Apache License, >>>> Version 2.0 >>>>>> + (the "License"); you may not use this file except in compliance >>>> with >>>>>> + the License. You may obtain a copy of the License at >>>>>> + >>>>>> + http://www.apache.org/licenses/LICENSE-2.0 >>>>>> + >>>>>> + Unless required by applicable law or agreed to in writing, >> software >>>>>> + distributed under the License is distributed on an "AS IS" BASIS, >>>>>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>> implied. >>>>>> + See the License for the specific language governing permissions >> and >>>>>> + limitations under the License. >>>>>> +--> >>>>>> + >>>>>> +# Log4j 2 JDBC Connection Source with Apache Commons DBCP 2 >>>>>> + >>>>>> +This module adds a connection source for JDBC Appenders. The >>>> PoolingDriverConnectionSource >>>>>> +provides connection pooling through Apache Commons DBCP 2. >>>>>> + >>>>>> +## Requirements >>>>>> + >>>>>> +This module was introduced in Log4j 2.11.0 and requires Apache >> Commons >>>> DBCP 2 to provide >>>>>> +connection pooling. >>>>>> + >>>>>> +Some features may require optional >>>>>> +[dependencies](../runtime-dependencies.html). These dependencies are >>>> specified in the >>>>>> +documentation for those features. >>>>>> + >>>>>> +Some Log4j features require external dependencies. >>>>>> +See the [Dependency Tree](dependencies.html#Dependency_Tree) >>>>>> +for the exact list of JAR files needed for these features. >>>>>> >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >>>> 639f093b/log4j-jdbc-dbcp2/src/site/site.xml >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> diff --git a/log4j-jdbc-dbcp2/src/site/site.xml >>>> b/log4j-jdbc-dbcp2/src/site/site.xml >>>>>> new file mode 100644 >>>>>> index 0000000..6d4cddc >>>>>> --- /dev/null >>>>>> +++ b/log4j-jdbc-dbcp2/src/site/site.xml >>>>>> @@ -0,0 +1,52 @@ >>>>>> +<!-- >>>>>> + Licensed to the Apache Software Foundation (ASF) under one or more >>>>>> + contributor license agreements. See the NOTICE file distributed >> with >>>>>> + this work for additional information regarding copyright ownership. >>>>>> + The ASF licenses this file to You under the Apache License, Version >>>> 2.0 >>>>>> + (the "License"); you may not use this file except in compliance with >>>>>> + the License. You may obtain a copy of the License at >>>>>> + >>>>>> + http://www.apache.org/licenses/LICENSE-2.0 >>>>>> + >>>>>> + Unless required by applicable law or agreed to in writing, software >>>>>> + distributed under the License is distributed on an "AS IS" BASIS, >>>>>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>> implied. >>>>>> + See the License for the specific language governing permissions and >>>>>> + limitations under the License. >>>>>> + >>>>>> +--> >>>>>> +<project name="Log4j Core" >>>>>> + xmlns="http://maven.apache.org/DECORATION/1.4.0" >>>>>> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>>>>> + xsi:schemaLocation="http://maven.apache.org/DECORATION/1. >> 4.0 >>>> http://maven.apache.org/xsd/decoration-1.4.0.xsd"> >>>>>> + <body> >>>>>> + <links> >>>>>> + <item name="Apache" href="http://www.apache.org/" /> >>>>>> + <item name="Logging Services" href="http://logging.apache.org/ >>>> "/> >>>>>> + <item name="Log4j" href="../index.html"/> >>>>>> + </links> >>>>>> + >>>>>> + <!-- Component-specific reports --> >>>>>> + <menu ref="reports"/> >>>>>> + >>>>>> + <!-- Overall Project Info --> >>>>>> + <menu name="Log4j Project Information" img="icon-info-sign"> >>>>>> + <item name="Dependencies" href="../dependencies.html" /> >>>>>> + <item name="Dependency Convergence" href="../dependency- >> convergence.html" >>>> /> >>>>>> + <item name="Dependency Management" href="../dependency- >> management.html" >>>> /> >>>>>> + <item name="Project Team" href="../team-list.html" /> >>>>>> + <item name="Mailing Lists" href="../mail-lists.html" /> >>>>>> + <item name="Issue Tracking" href="../issue-tracking.html" /> >>>>>> + <item name="Project License" href="../license.html" /> >>>>>> + <item name="Source Repository" href="../source-repository. >> html" >>>> /> >>>>>> + <item name="Project Summary" href="../project-summary.html" /> >>>>>> + </menu> >>>>>> + >>>>>> + <menu name="Log4j Project Reports" img="icon-cog"> >>>>>> + <item name="Changes Report" href="../changes-report.html" /> >>>>>> + <item name="JIRA Report" href="../jira-report.html" /> >>>>>> + <item name="Surefire Report" href="../surefire-report.html" /> >>>>>> + <item name="RAT Report" href="../rat-report.html" /> >>>>>> + </menu> >>>>>> + </body> >>>>>> +</project> >>>>>> >>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ >>>> 639f093b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/ >>>> log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >>>>>> ------------------------------------------------------------ >> ---------- >>>>>> diff --git a/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/ >>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >>>> b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/ >>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >>>>>> new file mode 100644 >>>>>> index 0000000..2b7b886 >>>>>> --- /dev/null >>>>>> +++ b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/ >>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java >>>>>> @@ -0,0 +1,96 @@ >>>>>> +/* >>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more >>>>>> + * contributor license agreements. See the NOTICE file distributed >> with >>>>>> + * this work for additional information regarding copyright >> ownership. >>>>>> + * The ASF licenses this file to You under the Apache license, >> Version >>>> 2.0 >>>>>> + * (the "License"); you may not use this file except in compliance >> with >>>>>> + * the License. You may obtain a copy of the License at >>>>>> + * >>>>>> + * http://www.apache.org/licenses/LICENSE-2.0 >>>>>> + * >>>>>> + * Unless required by applicable law or agreed to in writing, >> software >>>>>> + * distributed under the License is distributed on an "AS IS" BASIS, >>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>> implied. >>>>>> + * See the license for the specific language governing permissions >> and >>>>>> + * limitations under the license. >>>>>> + */ >>>>>> + >>>>>> +package org.apache.logging.log4j.core.appender.db.jdbc; >>>>>> + >>>>>> +import java.sql.Connection; >>>>>> +import java.sql.SQLException; >>>>>> + >>>>>> +import org.apache.logging.log4j.core.config.Property; >>>>>> +import org.junit.Assert; >>>>>> +import org.junit.Test; >>>>>> + >>>>>> +public class PoolingDriverConnectionSourceTest { >>>>>> + >>>>>> + @Test >>>>>> + public void testH2Properties() throws SQLException { >>>>>> + final Property[] properties = new Property[] { >>>>>> + // @formatter:off >>>>>> + Property.createProperty("username", >>>> JdbcH2TestHelper.USER_NAME), >>>>>> + Property.createProperty("password", >>>> JdbcH2TestHelper.PASSWORD), >>>>>> + // @formatter:on >>>>>> + }; >>>>>> + // @formatter:off >>>>>> + final PoolingDriverConnectionSource source = >>>> PoolingDriverConnectionSource.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> >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >> >> >>