When performing a release I always run the build a few times. Because it takes 
so long and because fixing a release that fails halfway through is such a pain 
I always run the build to make sure it will work before I start the release 
build, so I could certainly skip the tests when actually performing the release 
- as long as all the test artifacts are still created.

Ralph

> On Jan 22, 2018, at 1:40 PM, Gary Gregory <garydgreg...@gmail.com> wrote:
> 
> On Mon, Jan 22, 2018 at 12:26 PM, Matt Sicker <boa...@gmail.com 
> <mailto:boa...@gmail.com>> wrote:
> 
>> I still haven't seen a nice way to integrate multiple Maven-generated
>> websites as it is. If we broke into multiple repositories, we'd have to
>> basically rewrite the website infrastructure as well (which I've been
>> thinking about for a while anyways). As a result, either direction we take
>> (monorepo or multirepo) will require build optimizations (and not just
>> involving unit tests).
>> 
>> Based on wall time, what Remko is proposing makes the most sense. If we can
>> reduce the wall time of running tests significantly, then we'll solve a
>> majority of the problem.
>> 
>> If you wonder how much worse it could get, though, take a look at Camel.
>> They have literally dozens of modules with a full build taking hours. If
>> each component was released separately, they'd probably never get updated
>> considering how many components are about very specific libraries that not
>> many people would know how to verify or test. We have something similar
>> here as we add more esoteric appenders, logger adapters, and language
>> bindings.
>> 
>> As a follow up, if there is a way to reduce the full build and release time
>> by switching to a different build tool (e.g., Gradle, Bazel, Ant/Ivy, or
>> even something else in the JVM ecosystem not specific to Java), that may
>> also be worth investigating. I don't think it'll be necessary, but it's
>> something worth considering later on.
>> 
> 
> Yeah, this business of running the tests three times is wacky (test,
> jacoco, and site?) Surely, once the tests pass once to build the site for
> example, the other mvn invocations could use -DskipTests?
> 
> The code coverage is a different story. Maybe there is a way to run Jacoco
> and have the test results saved and reused by the site build for the code
> coverage report. Basically, this would skip the "test" goal/phase.
> 
> Arg,
> Gary
> 
> 
>> On 21 January 2018 at 00:18, Remko Popma <remko.po...@gmail.com> wrote:
>> 
>>> This looks promising:
>>> http://maven.apache.org/surefire/maven-surefire-
>>> plugin/examples/fork-options-and-parallel-execution.html
>>> (especially the @NotThreadSafe annotation, potentially in combination
>> with
>>> JUnit Suits)
>>> 
>>> 
>>> On Sun, Jan 21, 2018 at 13:12 Remko Popma <remko.po...@gmail.com> wrote:
>>> 
>>>> Mikael, Ralph,
>>>> 
>>>> Have you really thought through the implications of having a separate
>>>> repository for each module? The overhead is very large!
>>>> 
>>>> It would mean:
>>>> * a separate website for each repo (our current Log4j2 website only
>> knows
>>>> about the modules in the logging-log4j project).
>>>> * a separate release and release vote would need to be performed *for
>>> each
>>>> repo*. This process is so heavy that we only do it once a month for
>>> Log4j2.
>>>> Imagine doing this 10 times when we have 10 modules each in separate
>>> repos.
>>>> * synchronizing with the main Log4j project becomes checking and
>> updating
>>>> 10 projects instead of one.
>>>> 
>>>> All of these concerns already hold for a single log4j-plugins project,
>>>> they just multiply for each additional repo.
>>>> 
>>>> All,
>>>> 
>>>> Gary does have a point when he says we don’t have a clear plan for
>>>> managing the log4j-plugins repo. Who is going to check that the plugins
>>>> still compile after a Log4j2 release? Are we going to release a new
>>> plugins
>>>> version for each Log4j2 release? If not, when _will_ we release new
>>>> log4j-plugins versions?
>>>> 
>>>> Given our terrible track record for the log4j-tools project since we
>>>> moved TcpServer etc. into that repo (nobody showing interest to do the
>>>> work to release it), I agree these are valid concerns.
>>>> 
>>>> On the other hand, I also completely agree with Ralph that the build
>>> takes
>>>> much too long. Something needs to be done and Ralph is clearly
>> signalling
>>>> he won't have this problem ignored any longer.
>>>> 
>>>> I'm not sure that moving things out of the main repo is the only
>> solution
>>>> to make the build faster. If it really is the *only* solution, then
>> fine.
>>>> But be mindful we are trading one problem for a set of new ones, and,
>>> just
>>>> like we can't ignore the slow build problem, we also cannot ignore the
>>> new
>>>> problems introduced by this solution (keeping the new repo(s) in sync,
>>>> building new web sites and linking them into the main site, release
>>> timing
>>>> etc).
>>>> 
>>>> PROPOSAL:
>>>> I think all of us should take responsibility for speeding up the build
>>> and
>>>> make it our first priority.
>>>> If you want to add anything to the main project, *first reduce the
>> build
>>>> duration*. First find an existing test and speed it up. Only then add
>> new
>>>> stuff, keeping the total build time to the same or less than it was
>>>> before.  Building core and running its tests used to take 8 minutes.
>> Now
>>> it
>>>> takes 19:10 (`mvn clean package` on the whole project takes 24:22).
>>>> 
>>>> The core tests clearly are a major bottleneck.
>>>> 
>>>> Speeding up the core tests is something we can all work on. Can we
>> split
>>>> the tests into a set that can be run multi-threaded in parallel
>>> (fastest),
>>>> a different set that does not require forking (fast) and a third set
>> that
>>>> requires forking for every test (slowest)?
>>>> 
>>>> On the other hand, if we want to move things out of the main repo we
>> need
>>>> a plan for the new repo(s). There is a one-time work of setting up web
>>>> sites and integrating them with the main site, but on an ongoing basis
>> we
>>>> need some way to verify that a change in log4j-core did not break any
>>>> plugins, and agree to do a plugins release if it did break something.
>>>> 
>>>> Remko
>>>> 
>>>> 
>>>> On Sun, Jan 21, 2018 at 2:27 Ralph Goers <ralph.go...@dslextreme.com>
>>>> wrote:
>>>> 
>>>>> 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
>> &#169;
>>>>>>>>>>> {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/PoolingDriverConnectionSourceT
>>> est.java
>>>>>>>>>>>>> ------------------------------------------------------------
>>>>>>>>> ----------
>>>>>>>>>>>>> diff --git
>>>>> a/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/
>>>>>>>>>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
>>>>>>>>>>> b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/
>>>>>>>>>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
>>>>>>>>>>>>> new file mode 100644
>>>>>>>>>>>>> index 0000000..2b7b886
>>>>>>>>>>>>> --- /dev/null
>>>>>>>>>>>>> +++ b/log4j-jdbc-dbcp2/src/test/
>> java/org/apache/logging/log4j/
>>>>>>>>>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
>>>>>>>>>>>>> @@ -0,0 +1,96 @@
>>>>>>>>>>>>> +/*
>>>>>>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under
>> one
>>>>> or more
>>>>>>>>>>>>> + * contributor license agreements. See the NOTICE file
>>>>> distributed
>>>>>>>>> with
>>>>>>>>>>>>> + * this work for additional information regarding copyright
>>>>>>>>> ownership.
>>>>>>>>>>>>> + * The ASF licenses this file to You under the Apache
>> license,
>>>>>>>>> Version
>>>>>>>>>>> 2.0
>>>>>>>>>>>>> + * (the "License"); you may not use this file except in
>>>>> compliance
>>>>>>>>> with
>>>>>>>>>>>>> + * the License. You may obtain a copy of the License at
>>>>>>>>>>>>> + *
>>>>>>>>>>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>>>>>>>>>>> + *
>>>>>>>>>>>>> + * Unless required by applicable law or agreed to in
>> writing,
>>>>>>>>> software
>>>>>>>>>>>>> + * distributed under the License is distributed on an "AS
>> IS"
>>>>> BASIS,
>>>>>>>>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
>>> express
>>>>> or
>>>>>>>>>>> implied.
>>>>>>>>>>>>> + * See the license for the specific language governing
>>>>> permissions
>>>>>>>>> and
>>>>>>>>>>>>> + * limitations under the license.
>>>>>>>>>>>>> + */
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +package org.apache.logging.log4j.core.appender.db.jdbc;
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +import java.sql.Connection;
>>>>>>>>>>>>> +import java.sql.SQLException;
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +import org.apache.logging.log4j.core.config.Property;
>>>>>>>>>>>>> +import org.junit.Assert;
>>>>>>>>>>>>> +import org.junit.Test;
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +public class PoolingDriverConnectionSourceTest {
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +    @Test
>>>>>>>>>>>>> +    public void testH2Properties() throws SQLException {
>>>>>>>>>>>>> +        final Property[] properties = new Property[] {
>>>>>>>>>>>>> +                // @formatter:off
>>>>>>>>>>>>> +                Property.createProperty("username",
>>>>>>>>>>> JdbcH2TestHelper.USER_NAME),
>>>>>>>>>>>>> +                Property.createProperty("password",
>>>>>>>>>>> JdbcH2TestHelper.PASSWORD),
>>>>>>>>>>>>> +                // @formatter:on
>>>>>>>>>>>>> +        };
>>>>>>>>>>>>> +        // @formatter:off
>>>>>>>>>>>>> +        final PoolingDriverConnectionSource source =
>>>>>>>>>>> 
>>>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
>> ceBuilder()
>>>>>>>>>>>>> +
>>>>> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
>>>>>>>>>>>>> +            .setProperties(properties)
>>>>>>>>>>>>> +            .build();
>>>>>>>>>>>>> +        // @formatter:on
>>>>>>>>>>>>> +        try (Connection conn = source.getConnection()) {
>>>>>>>>>>>>> +            Assert.assertFalse(conn.isClosed());
>>>>>>>>>>>>> +        }
>>>>>>>>>>>>> +    }
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +    @Test
>>>>>>>>>>>>> +    public void testH2PropertiesAndPoolName() throws
>>>>> SQLException {
>>>>>>>>>>>>> +        final Property[] properties = new Property[] {
>>>>>>>>>>>>> +                // @formatter:off
>>>>>>>>>>>>> +                Property.createProperty("username",
>>>>>>>>>>> JdbcH2TestHelper.USER_NAME),
>>>>>>>>>>>>> +                Property.createProperty("password",
>>>>>>>>>>> JdbcH2TestHelper.PASSWORD),
>>>>>>>>>>>>> +                // @formatter:on
>>>>>>>>>>>>> +        };
>>>>>>>>>>>>> +        // @formatter:off
>>>>>>>>>>>>> +        final PoolingDriverConnectionSource source =
>>>>>>>>>>> 
>>>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
>> ceBuilder()
>>>>>>>>>>>>> +
>>>>> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
>>>>>>>>>>>>> +            .setProperties(properties)
>>>>>>>>>>>>> +            .setPoolName("MyPoolName")
>>>>>>>>>>>>> +            .build();
>>>>>>>>>>>>> +        // @formatter:on
>>>>>>>>>>>>> +        try (Connection conn = source.getConnection()) {
>>>>>>>>>>>>> +            Assert.assertFalse(conn.isClosed());
>>>>>>>>>>>>> +        }
>>>>>>>>>>>>> +    }
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +    @Test
>>>>>>>>>>>>> +    public void testH2UserAndPassword() throws SQLException
>> {
>>>>>>>>>>>>> +        // @formatter:off
>>>>>>>>>>>>> +        final PoolingDriverConnectionSource source =
>>>>>>>>>>> 
>>>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
>> ceBuilder()
>>>>>>>>>>>>> +
>>>>> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
>>>>>>>>>>>>> +
>>>>> .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray())
>>>>>>>>>>>>> +
>>>>> .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray())
>>>>>>>>>>>>> +            .build();
>>>>>>>>>>>>> +        // @formatter:on
>>>>>>>>>>>>> +        try (Connection conn = source.getConnection()) {
>>>>>>>>>>>>> +            Assert.assertFalse(conn.isClosed());
>>>>>>>>>>>>> +        }
>>>>>>>>>>>>> +    }
>>>>>>>>>>>>> +
>>>>>>>>>>>>> +    @Test
>>>>>>>>>>>>> +    public void testH2UserPasswordAndPoolName() throws
>>>>> SQLException
>>>>>>>>> {
>>>>>>>>>>>>> +        // @formatter:off
>>>>>>>>>>>>> +        final PoolingDriverConnectionSource source =
>>>>>>>>>>> 
>>>>> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
>> ceBuilder()
>>>>>>>>>>>>> +
>>>>> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
>>>>>>>>>>>>> +
>>>>> .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray())
>>>>>>>>>>>>> +
>>>>> .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray())
>>>>>>>>>>>>> +            .setPoolName("MyPoolName")
>>>>>>>>>>>>> +            .build();
>>>>>>>>>>>>> +        // @formatter:on
>>>>>>>>>>>>> +        try (Connection conn = source.getConnection()) {
>>>>>>>>>>>>> +            Assert.assertFalse(conn.isClosed());
>>>>>>>>>>>>> +        }
>>>>>>>>>>>>> +    }
>>>>>>>>>>>>> +}
>>>>>>>>>>>>> 
>>>>>>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
>>>>>>>>>>> 639f093b/pom.xml
>>>>>>>>>>>>> ------------------------------------------------------------
>>>>>>>>> ----------
>>>>>>>>>>>>> diff --git a/pom.xml b/pom.xml
>>>>>>>>>>>>> index 31195f2..f1027f2 100644
>>>>>>>>>>>>> --- a/pom.xml
>>>>>>>>>>>>> +++ b/pom.xml
>>>>>>>>>>>>> @@ -1320,6 +1320,7 @@
>>>>>>>>>>>>> <module>log4j-jmx-gui</module>
>>>>>>>>>>>>> <module>log4j-samples</module>
>>>>>>>>>>>>> <module>log4j-bom</module>
>>>>>>>>>>>>> +    <module>log4j-jdbc-dbcp2</module>
>>>>>>>>>>>>> <module>log4j-couchdb</module>
>>>>>>>>>>>>> <module>log4j-mongodb</module>
>>>>>>>>>>>>> <module>log4j-cassandra</module>
>>>>>>>>>>>>> 
>>>>>>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
>>>>>>>>>>> 639f093b/src/changes/changes.xml
>>>>>>>>>>>>> ------------------------------------------------------------
>>>>>>>>> ----------
>>>>>>>>>>>>> diff --git a/src/changes/changes.xml
>> b/src/changes/changes.xml
>>>>>>>>>>>>> index 3ca94e4..6398bb0 100644
>>>>>>>>>>>>> --- a/src/changes/changes.xml
>>>>>>>>>>>>> +++ b/src/changes/changes.xml
>>>>>>>>>>>>> @@ -104,6 +104,9 @@
>>>>>>>>>>>>>   <action issue="LOG4J2-2198" dev="ggregory" type="update">
>>>>>>>>>>>>>     Update MongoDB dependencies from classic to modern.
>>>>>>>>>>>>>   </action>
>>>>>>>>>>>>> +      <action issue="LOG4J2-2186" dev="ggregory" type="add">
>>>>>>>>>>>>> +        Add a JDBC ConnectionSource that provides pooling
>>>>> through
>>>>>>>>>>> Apache Commons DBCP 2.
>>>>>>>>>>>>> +      </action>
>>>>>>>>>>>>> </release>
>>>>>>>>>>>>> <release version="2.10.0" date="2017-11-18" description="GA
>>>>> Release
>>>>>>>>>>> 2.10.0">
>>>>>>>>>>>>>   <action issue="LOG4J2-2120" dev="mikes" type="add"
>>>>> due-to="Carter
>>>>>>>>>>> Douglas Kozak ">
>>>>>>>>>>>>> 
>>>>>>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
>>>>>>>>>>> 639f093b/src/site/xdoc/manual/appenders.xml
>>>>>>>>>>>>> ------------------------------------------------------------
>>>>>>>>> ----------
>>>>>>>>>>>>> diff --git a/src/site/xdoc/manual/appenders.xml
>>>>>>>>> b/src/site/xdoc/manual/
>>>>>>>>>>> appenders.xml
>>>>>>>>>>>>> index c62a284..4f106df 100644
>>>>>>>>>>>>> --- a/src/site/xdoc/manual/appenders.xml
>>>>>>>>>>>>> +++ b/src/site/xdoc/manual/appenders.xml
>>>>>>>>>>>>> @@ -1070,9 +1070,10 @@ CREATE TABLE logs (
>>>>>>>>>>>>>       <p>When configuring the JDBCAppender, you must
>> specify a
>>>>>>>>>>> <code>ConnectionSource</code> implementation from
>>>>>>>>>>>>>         which the Appender gets JDBC connections. You must
>> use
>>>>>>>>>>> exactly one of the following nested elements:</p>
>>>>>>>>>>>>>       <ul>
>>>>>>>>>>>>> -            <li><a href="#JDBCDataSource"><code>&
>>>>>>>>>>> lt;DataSource&gt;</code></a></li>
>>>>>>>>>>>>> -            <li><a href="#JDBCConnectionFactory">
>>>>>>>>>>> <code>&lt;ConnectionFactory&gt;</code></a></li>
>>>>>>>>>>>>> -            <li><a href="#JDBCDriverManager"><
>>>>>>>>>>> code>&lt;DriverManager&gt;</code></a></li>
>>>>>>>>>>>>> +            <li><a href="#JDBCDataSource"><code>&
>>>>>>>>> lt;DataSource&gt;</code></a>:
>>>>>>>>>>> Uses JNDI.</li>
>>>>>>>>>>>>> +            <li><a href="#JDBCConnectionFactory">
>>>>>>>>>>> <code>&lt;ConnectionFactory&gt;</code></a>: Points to a
>>>>> class-method
>>>>>>>>> pair
>>>>>>>>>>> to provide JDBC connections.</li>
>>>>>>>>>>>>> +            <li><a href="#JDBCDriverManager"><
>>>>>>>>>>> code>&lt;DriverManager&gt;</code></a>: A quick and dirty way
>> to
>>>>> get off
>>>>>>>>>>> the ground, no connection pooling.</li>
>>>>>>>>>>>>> +            <li><a href="#JDBCPoolingDriver"><
>>>>>>>>>>> code>&lt;PoolingDriver&gt;</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>&lt;Column&gt;</code> elements to specify which
>>>>>>>>>>>>>         columns in the table should be written to and how to
>>>>> write
>>>>>>>>>>> to them. The JDBCAppender uses this information
>>>>>>>>>>>>>         to formulate a <code>PreparedStatement</code> to
>>> insert
>>>>>>>>>>> records without SQL injection vulnerability.</p>
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>> 
>> 
>> 
>> 
>> --
>> Matt Sicker <boa...@gmail.com>

Reply via email to