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