On Mon, Jan 22, 2018 at 3:14 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> I started to read it but it is too long. To be honest I would love it if > I could just run the release from Jenkins. Unfortunately, that would > require someone’s code signing key which would be a bit problematic to > install on a shared server. In addition, I am a bit paranoid about making > sure the build is going to work before starting it. We have lots of cases > where the build works on our machines and fails in Jenkins, or vice versa. > And the Jenkins build seems to fail 50% of them time anyway. > What used to make the Jenkins build fail a lot was the log4j-osgi module tests. I fixed that last week. Jenkins still does randomly fail uploading/downloading files though. Nothing we can do about that one. The code signing stuff is a non-starter, you can't just put your key up there. Gary > Ralph > > > On Jan 22, 2018, at 1:54 PM, Matt Sicker <boa...@gmail.com> wrote: > > > > I read this blog post recently about build tools and found it > interesting: < > > http://www.lihaoyi.com/post/BuildToolsasPureFunctionalPrograms.html>. > > Perhaps we can lift some ideas from here to find some build optimizations > > we may have missed (e.g., caching settings). > > > > On 22 January 2018 at 14:40, Gary Gregory <garydgreg...@gmail.com> > wrote: > > > >> On Mon, Jan 22, 2018 at 12:26 PM, Matt Sicker <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> > >>> > >> > > > > > > > > -- > > Matt Sicker <boa...@gmail.com> > > >