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 >> © >>>>>>>>>>> {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></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> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>> >> >> >> >> -- >> Matt Sicker <boa...@gmail.com>