This is an automated email from the ASF dual-hosted git repository.
yong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push:
new a522fa3 Issue 2815: Upgrade to log4j2 to get rid of CVE-2019-17571
(#2816)
a522fa3 is described below
commit a522fa33b31e2405830a33cd2120be60d3174cd5
Author: Raúl Gracia <[email protected]>
AuthorDate: Fri Oct 15 02:16:02 2021 +0200
Issue 2815: Upgrade to log4j2 to get rid of CVE-2019-17571 (#2816)
### Motivation
Upgrades to log4j2 to get rid of CVE-2019-17571.
### Changes
The migration of log4j has been done mainly taking the official guidelines:
https://logging.apache.org/log4j/2.x/manual/migration.html.
In this PR, the following changes are included:
- Replacement of `slf4j-log4j12` by `log4j-1.2-api`. Also included the
`log4j-slf4j-impl` binding as well as the `log4j-core` library.
- Changes in `pom`, `gradle` and license files to reflect the above library
upgrade.
- Test classes `TestOrderedExecutorDecorators`, `LoggerOutput`,
`MdcContextTest`, as well as the class `FIleSystemUpgrade` made use of log4j1.2
API. This PR attempts to keep the same functionality with the new APIs.
### Verification
- Existing tests are passing.
- log4j1.2 is removed from project:
https://github.com/apache/bookkeeper/pull/2816#issuecomment-937818625
- Using `localbookie`, we observe that logs are shown correctly:
```
2021-10-07T16:04:23,757 - INFO - [main:GarbageCollectorThread@245] - Minor
Compaction : enabled=true, threshold=0.20000000298023224, interval=3600000
2021-10-07T16:04:23,760 - INFO - [main:GarbageCollectorThread@247] - Major
Compaction : enabled=true, threshold=0.800000011920929, interval=86400000
2021-10-07T16:04:23,952 - INFO - [main:BookieImpl@920] - Finished
replaying journal in 2 ms.
2021-10-07T16:04:23,958 - INFO - [SyncThread-7-1:SyncThread@135] - Flush
ledger storage at checkpoint CheckpointList{checkpoints=[LogMark: logFileId - 0
, logFileOffset - 0]}.
2021-10-07T16:04:23,980 - INFO - [main:BookieImpl@1010] - Finished reading
journal, starting bookie
2021-10-07T16:04:24,011 - INFO - [BookieJournal-5000:Journal@919] -
Starting journal on /tmp/localbookkeeper06554024139823286046test/current
2021-10-07T16:04:24,031 - INFO -
[ForceWriteThread:Journal$ForceWriteThread@478] - ForceWrite Thread started
2021-10-07T16:04:24,048 - INFO - [BookieJournal-5000:JournalChannel@169] -
Opening journal
/tmp/localbookkeeper06554024139823286046test/current/17c5b11c65b.txn
```
In addition to that, if we change the `log4j.properties` file, the changes
are reflected in the console output, meaning that the legacy configuration
works and changes can be correctly applied:
```
Over Replicated Ledger Deletion : enabled=true, interval=86400000
Minor Compaction : enabled=true, threshold=0.20000000298023224,
interval=3600000
Major Compaction : enabled=true, threshold=0.800000011920929,
interval=86400000
Finished replaying journal in 5 ms.
Flush ledger storage at checkpoint CheckpointList{checkpoints=[LogMark:
logFileId - 0 , logFileOffset - 0]}.
Finished reading journal, starting bookie
Starting journal on /tmp/localbookkeeper015049859959001160726test/current
ForceWrite Thread started
Opening journal
/tmp/localbookkeeper015049859959001160726test/current/17c5b143063.txn
```
More verifications that logging works properly related to other Bookkeeper
sub-components impacted may be needed.
Master Issue: #2815
---
bookkeeper-common/build.gradle | 5 +--
bookkeeper-common/pom.xml | 20 +++++++++++
.../bookkeeper/common/util/OrderedExecutor.java | 2 +-
.../common/util/TestOrderedExecutorDecorators.java | 40 ++++++++++++----------
bookkeeper-dist/all/build.gradle | 2 +-
bookkeeper-dist/all/pom.xml | 12 +++++--
bookkeeper-dist/bkctl/pom.xml | 12 +++++--
bookkeeper-dist/server/build.gradle | 2 +-
bookkeeper-dist/server/pom.xml | 12 +++++--
.../src/main/resources/LICENSE-all.bin.txt | 8 +++--
.../src/main/resources/LICENSE-bkctl.bin.txt | 8 +++--
.../src/main/resources/LICENSE-server.bin.txt | 8 +++--
bookkeeper-server/build.gradle | 4 ++-
bookkeeper-server/pom.xml | 12 +++++--
.../bookkeeper/bookie/FileSystemUpgrade.java | 6 ++--
.../apache/bookkeeper/client/MdcContextTest.java | 36 ++++++++++---------
.../org/apache/bookkeeper/util/LoggerOutput.java | 38 +++++++++++---------
dependencies.gradle | 7 ++--
microbenchmarks/pom.xml | 12 +++++--
pom.xml | 27 ++++++++++-----
stats/utils/build.gradle | 2 +-
stream/distributedlog/io/dlfs/pom.xml | 8 +++++
stream/server/build.gradle | 2 +-
.../tests/integration/utils/MavenClassLoader.java | 3 +-
tests/integration/cluster/build.gradle | 2 +-
tools/ledger/pom.xml | 14 ++++++--
tools/perf/build.gradle | 2 +-
tools/stream/build.gradle | 2 +-
28 files changed, 210 insertions(+), 98 deletions(-)
diff --git a/bookkeeper-common/build.gradle b/bookkeeper-common/build.gradle
index 27a9a06..94b5b36 100644
--- a/bookkeeper-common/build.gradle
+++ b/bookkeeper-common/build.gradle
@@ -41,9 +41,10 @@ dependencies {
testImplementation depLibs.commonsLang3
testImplementation depLibs.hamcrest
testImplementation depLibs.junit
- testImplementation depLibs.log4j
+ testImplementation depLibs.log4jSlf4jImpl
+ testImplementation depLibs.log4j12api
+ testImplementation depLibs.log4jCore
testImplementation depLibs.mockito
- testImplementation depLibs.slf4jLog4j
annotationProcessor depLibs.lombok
testAnnotationProcessor depLibs.lombok
diff --git a/bookkeeper-common/pom.xml b/bookkeeper-common/pom.xml
index 82a6792..c1065c9 100644
--- a/bookkeeper-common/pom.xml
+++ b/bookkeeper-common/pom.xml
@@ -74,6 +74,26 @@
<artifactId>commons-lang3</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
</dependencies>
<build>
<plugins>
diff --git
a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
index 4330340..2c89211 100644
---
a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
+++
b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/util/OrderedExecutor.java
@@ -410,7 +410,7 @@ public class OrderedExecutor implements ExecutorService {
try {
CpuAffinity.acquireCore();
} catch (Throwable t) {
- log.warn("Failed to acquire CPU core for thread
{}", Thread.currentThread().getName(),
+ log.warn("Failed to acquire CPU core for thread
{}: {}", Thread.currentThread().getName(),
t.getMessage(), t);
}
}
diff --git
a/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutorDecorators.java
b/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutorDecorators.java
index f03b24d..f8d53b4 100644
---
a/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutorDecorators.java
+++
b/bookkeeper-common/src/test/java/org/apache/bookkeeper/common/util/TestOrderedExecutorDecorators.java
@@ -27,18 +27,18 @@ import static org.junit.Assert.assertThat;
import static org.mockito.AdditionalAnswers.answerVoid;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.spy;
import java.util.Queue;
+import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;
-import org.apache.log4j.Appender;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
import org.apache.log4j.MDC;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.NullAppender;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -53,7 +53,7 @@ public class TestOrderedExecutorDecorators {
private static final Logger log =
LoggerFactory.getLogger(TestOrderedExecutorDecorators.class);
private static final String MDC_KEY = "mdc-key";
- private Appender mockAppender;
+ private NullAppender mockAppender;
private final Queue<String> capturedEvents = new ConcurrentLinkedQueue<>();
public static String mdcFormat(Object mdc, String message) {
@@ -63,21 +63,25 @@ public class TestOrderedExecutorDecorators {
@Before
public void setUp() throws Exception {
MDC.clear();
- mockAppender = mock(Appender.class);
- when(mockAppender.getName()).thenReturn("MockAppender");
-
- LogManager.getRootLogger().addAppender(mockAppender);
- LogManager.getRootLogger().setLevel(Level.INFO);
-
- doAnswer(answerVoid((LoggingEvent event) -> {
- capturedEvents.add(mdcFormat(event.getMDC(MDC_KEY),
- event.getRenderedMessage()));
- })).when(mockAppender).doAppend(any());
+ LoggerContext lc = (LoggerContext)
org.apache.logging.log4j.LogManager.getContext(false);
+ mockAppender =
spy(NullAppender.createAppender(UUID.randomUUID().toString()));
+ mockAppender.start();
+ lc.getConfiguration().addAppender(mockAppender);
+
lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(mockAppender.getName()));
+ lc.getConfiguration().getRootLogger().setLevel(Level.INFO);
+ lc.updateLoggers();
+
+ doAnswer(answerVoid((LogEvent event) -> {
+
capturedEvents.add(mdcFormat(event.getContextData().getValue(MDC_KEY),
+
event.getMessage().getFormattedMessage()));
+ })).when(mockAppender).append(any());
}
@After
public void tearDown() throws Exception {
- LogManager.getRootLogger().removeAppender(mockAppender);
+ LoggerContext lc = (LoggerContext)
org.apache.logging.log4j.LogManager.getContext(false);
+
lc.getRootLogger().removeAppender(lc.getConfiguration().getAppender(mockAppender.getName()));
+ lc.updateLoggers();
capturedEvents.clear();
MDC.clear();
}
diff --git a/bookkeeper-dist/all/build.gradle b/bookkeeper-dist/all/build.gradle
index 2ad3719..343f01a 100644
--- a/bookkeeper-dist/all/build.gradle
+++ b/bookkeeper-dist/all/build.gradle
@@ -40,7 +40,7 @@ dependencies {
compileOnly depLibs.lombok
compileOnly depLibs.spotbugsAnnotations
- implementation depLibs.slf4jLog4j
+ implementation depLibs.log4j12api
testCompileOnly depLibs.lombok
diff --git a/bookkeeper-dist/all/pom.xml b/bookkeeper-dist/all/pom.xml
index c337e99..146dafa 100644
--- a/bookkeeper-dist/all/pom.xml
+++ b/bookkeeper-dist/all/pom.xml
@@ -99,8 +99,16 @@
<!-- slf4j binding -->
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
diff --git a/bookkeeper-dist/bkctl/pom.xml b/bookkeeper-dist/bkctl/pom.xml
index a4ab31f..8ac6545 100644
--- a/bookkeeper-dist/bkctl/pom.xml
+++ b/bookkeeper-dist/bkctl/pom.xml
@@ -47,8 +47,16 @@
<!-- slf4j binding -->
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
</dependencies>
diff --git a/bookkeeper-dist/server/build.gradle
b/bookkeeper-dist/server/build.gradle
index a3264f7..6ce817d 100644
--- a/bookkeeper-dist/server/build.gradle
+++ b/bookkeeper-dist/server/build.gradle
@@ -42,7 +42,7 @@ dependencies {
compileOnly depLibs.lombok
compileOnly depLibs.spotbugsAnnotations
- implementation depLibs.slf4jLog4j
+ implementation depLibs.log4j12api
testCompileOnly depLibs.lombok
diff --git a/bookkeeper-dist/server/pom.xml b/bookkeeper-dist/server/pom.xml
index 41edb48..83777f5 100644
--- a/bookkeeper-dist/server/pom.xml
+++ b/bookkeeper-dist/server/pom.xml
@@ -85,8 +85,16 @@
<!-- slf4j binding -->
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
diff --git a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt
b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt
index 5eab1cf..d13f96a 100644
--- a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt
+++ b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt
@@ -241,7 +241,10 @@ Apache Software License, Version 2.
- lib/io.vertx-vertx-core-3.9.8.jar [15]
- lib/io.vertx-vertx-web-3.9.8.jar [16]
- lib/io.vertx-vertx-web-common-3.9.8.jar [16]
-- lib/log4j-log4j-1.2.17.jar [17]
+- lib/org.apache.logging.log4j-log4j-1.2-api-2.14.1.jar [17]
+- lib/org.apache.logging.log4j-log4j-api-2.14.1.jar [17]
+- lib/org.apache.logging.log4j-log4j-core-2.14.1.jar [17]
+- lib/org.apache.logging.log4j-log4j-slf4j-impl-2.14.1.jar [17]
- lib/net.java.dev.jna-jna-3.2.7.jar [18]
- lib/org.apache.commons-commons-collections4-4.1.jar [19]
- lib/org.apache.commons-commons-lang3-3.6.jar [20]
@@ -318,7 +321,7 @@ Apache Software License, Version 2.
[14] Source available at
https://github.com/vert-x3/vertx-bridge-common/tree/3.9.8
[15] Source available at https://github.com/eclipse/vert.x/tree/3.9.8
[16] Source available at https://github.com/vert-x3/vertx-web/tree/3.9.8
-[17] Source available at http://logging.apache.org/log4j/1.2/download.html
+[17] Source available at
https://github.com/apache/logging-log4j2/tree/rel/2.14.1
[18] Source available at https://github.com/java-native-access/jna/tree/3.2.7
[19] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-collections.git;a=tag;h=a3a5ad
[20] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-lang.git;a=shortlog;h=refs/tags/LANG_3_6
@@ -639,7 +642,6 @@ MIT license. For details, see deps/slf4j-1.7.32/LICENSE.txt.
Bundled as
- lib/org.slf4j-slf4j-api-1.7.32.jar
- - lib/org.slf4j-slf4j-log4j12-1.7.32.jar
Source available at https://github.com/qos-ch/slf4j/tree/v_1.7.32
------------------------------------------------------------------------------------
This product bundles the Google Auth Library, which is available under a
"3-clause BSD"
diff --git a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt
b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt
index b02283b..ceaa468 100644
--- a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt
+++ b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt
@@ -230,7 +230,10 @@ Apache Software License, Version 2.
- lib/io.netty-netty-transport-4.1.68.Final.jar [11]
- lib/io.netty-netty-transport-native-epoll-4.1.68.Final-linux-x86_64.jar [11]
- lib/io.netty-netty-transport-native-unix-common-4.1.68.Final.jar [11]
-- lib/log4j-log4j-1.2.17.jar [16]
+- lib/org.apache.logging.log4j-log4j-1.2-api-2.14.1.jar [16]
+- lib/org.apache.logging.log4j-log4j-api-2.14.1.jar [16]
+- lib/org.apache.logging.log4j-log4j-core-2.14.1.jar [16]
+- lib/org.apache.logging.log4j-log4j-slf4j-impl-2.14.1.jar [16]
- lib/net.java.dev.jna-jna-3.2.7.jar [17]
- lib/org.apache.commons-commons-collections4-4.1.jar [18]
- lib/org.apache.commons-commons-lang3-3.6.jar [19]
@@ -290,7 +293,7 @@ Apache Software License, Version 2.
[9] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-lang.git;a=tag;h=375459
[10] Source available at
http://svn.apache.org/viewvc/commons/proper/logging/tags/commons-logging-1.1.1/
[11] Source available at https://github.com/netty/netty/tree/netty-4.1.68.Final
-[16] Source available at http://logging.apache.org/log4j/1.2/download.html
+[16] Source available at
https://github.com/apache/logging-log4j2/tree/rel/2.14.1
[17] Source available at https://github.com/java-native-access/jna/tree/3.2.7
[18] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-collections.git;a=tag;h=a3a5ad
[19] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-lang.git;a=shortlog;h=refs/tags/LANG_3_6
@@ -565,7 +568,6 @@ MIT license. For details, see deps/slf4j-1.7.32/LICENSE.txt.
Bundled as
- lib/org.slf4j-slf4j-api-1.7.32.jar
- - lib/org.slf4j-slf4j-log4j12-1.7.32.jar
Source available at https://github.com/qos-ch/slf4j/tree/v_1.7.32
------------------------------------------------------------------------------------
This product bundles the Google Auth Library, which is available under a
"3-clause BSD"
diff --git a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt
b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt
index 4dfb97c..7c0bad9 100644
--- a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt
+++ b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt
@@ -241,7 +241,10 @@ Apache Software License, Version 2.
- lib/io.vertx-vertx-core-3.9.8.jar [15]
- lib/io.vertx-vertx-web-3.9.8.jar [16]
- lib/io.vertx-vertx-web-common-3.9.8.jar [16]
-- lib/log4j-log4j-1.2.17.jar [17]
+- lib/org.apache.logging.log4j-log4j-1.2-api-2.14.1.jar [17]
+- lib/org.apache.logging.log4j-log4j-api-2.14.1.jar [17]
+- lib/org.apache.logging.log4j-log4j-core-2.14.1.jar [17]
+- lib/org.apache.logging.log4j-log4j-slf4j-impl-2.14.1.jar [17]
- lib/net.java.dev.jna-jna-3.2.7.jar [18]
- lib/org.apache.commons-commons-collections4-4.1.jar [19]
- lib/org.apache.commons-commons-lang3-3.6.jar [20]
@@ -316,7 +319,7 @@ Apache Software License, Version 2.
[14] Source available at
https://github.com/vert-x3/vertx-bridge-common/tree/3.9.8
[15] Source available at https://github.com/eclipse/vert.x/tree/3.9.8
[16] Source available at https://github.com/vert-x3/vertx-web/tree/3.9.8
-[17] Source available at http://logging.apache.org/log4j/1.2/download.html
+[17] Source available at
https://github.com/apache/logging-log4j2/tree/rel/2.14.1
[18] Source available at https://github.com/java-native-access/jna/tree/3.2.7
[19] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-collections.git;a=tag;h=a3a5ad
[20] Source available at
https://git-wip-us.apache.org/repos/asf?p=commons-lang.git;a=shortlog;h=refs/tags/LANG_3_6
@@ -631,7 +634,6 @@ MIT license. For details, see deps/slf4j-1.7.32/LICENSE.txt.
Bundled as
- lib/org.slf4j-slf4j-api-1.7.32.jar
- - lib/org.slf4j-slf4j-log4j12-1.7.32.jar
Source available at https://github.com/qos-ch/slf4j/tree/v_1.7.32
------------------------------------------------------------------------------------
This product bundles the Google Auth Library, which is available under a
"3-clause BSD"
diff --git a/bookkeeper-server/build.gradle b/bookkeeper-server/build.gradle
index b413c34..b18ed01 100644
--- a/bookkeeper-server/build.gradle
+++ b/bookkeeper-server/build.gradle
@@ -72,7 +72,9 @@ dependencies {
testImplementation depLibs.zookeeperTest
annotationProcessor depLibs.lombok
testAnnotationProcessor depLibs.lombok
- testImplementation depLibs.slf4jLog4j
+ testImplementation depLibs.log4jSlf4jImpl
+ testImplementation depLibs.log4j12api
+ testImplementation depLibs.log4jCore
}
test {
diff --git a/bookkeeper-server/pom.xml b/bookkeeper-server/pom.xml
index 6c5e025..07004c8 100644
--- a/bookkeeper-server/pom.xml
+++ b/bookkeeper-server/pom.xml
@@ -50,8 +50,16 @@
<artifactId>rocksdbjni</artifactId>
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
diff --git
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java
index 3ba3675..b009eae 100644
---
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java
+++
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/FileSystemUpgrade.java
@@ -52,6 +52,7 @@ import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.io.FileUtils;
+import org.apache.log4j.ConsoleAppender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -335,8 +336,9 @@ public class FileSystemUpgrade {
public static void main(String[] args) throws Exception {
org.apache.log4j.Logger root = org.apache.log4j.Logger.getRootLogger();
- root.addAppender(new org.apache.log4j.ConsoleAppender(
- new org.apache.log4j.PatternLayout("%-5p
[%t]: %m%n")));
+ ConsoleAppender console = new org.apache.log4j.ConsoleAppender();
+ console.setLayout(new org.apache.log4j.PatternLayout("%-5p [%t]:
%m%n"));
+ root.addAppender(console);
root.setLevel(org.apache.log4j.Level.ERROR);
org.apache.log4j.Logger.getLogger(FileSystemUpgrade.class).setLevel(
org.apache.log4j.Level.INFO);
diff --git
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java
index 54cfaa5..51d66d8 100644
---
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java
+++
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MdcContextTest.java
@@ -28,11 +28,11 @@ import static org.junit.Assert.fail;
import static org.mockito.AdditionalAnswers.answerVoid;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.spy;
import java.io.File;
import java.util.Queue;
+import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import lombok.extern.slf4j.Slf4j;
@@ -43,12 +43,10 @@ import
org.apache.bookkeeper.bookie.InterleavedLedgerStorage;
import org.apache.bookkeeper.bookie.LedgerDirsManager;
import org.apache.bookkeeper.conf.ClientConfiguration;
import org.apache.bookkeeper.test.BookKeeperClusterTestCase;
-import org.apache.log4j.Appender;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.NullAppender;
import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.Assert;
@@ -69,9 +67,8 @@ public class MdcContextTest extends BookKeeperClusterTestCase
{
BookKeeper bkc;
LedgerHandle lh;
- private Appender mockAppender;
+ private NullAppender mockAppender;
private Queue<String> capturedEvents;
- private Logger rootLogger = LogManager.getRootLogger();
public MdcContextTest() {
super(3);
@@ -118,23 +115,28 @@ public class MdcContextTest extends
BookKeeperClusterTestCase {
lh = bkc.createLedgerAdv(3, 3, 3, BookKeeper.DigestType.CRC32, new
byte[] {});
MDC.clear();
- mockAppender = mock(Appender.class);
- when(mockAppender.getName()).thenReturn("MockAppender");
+ LoggerContext lc = (LoggerContext)
org.apache.logging.log4j.LogManager.getContext(false);
+ mockAppender =
spy(NullAppender.createAppender(UUID.randomUUID().toString()));
+ mockAppender.start();
+ lc.getConfiguration().addAppender(mockAppender);
+
lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(mockAppender.getName()));
+
lc.getConfiguration().getRootLogger().setLevel(org.apache.logging.log4j.Level.INFO);
+ lc.updateLoggers();
- rootLogger.addAppender(mockAppender);
- rootLogger.setLevel(Level.INFO);
capturedEvents = new ConcurrentLinkedQueue<>();
- doAnswer(answerVoid((LoggingEvent event) -> capturedEvents.add(
- mdcFormat(event.getMDC(MDC_REQUEST_ID),
event.getRenderedMessage())
- ))).when(mockAppender).doAppend(any());
+ doAnswer(answerVoid((LogEvent event) -> capturedEvents.add(
+ mdcFormat(event.getContextData().getValue(MDC_REQUEST_ID),
event.getMessage().getFormattedMessage())
+ ))).when(mockAppender).append(any());
}
@After
public void tearDown() throws Exception {
lh.close();
bkc.close();
- rootLogger.removeAppender(mockAppender);
+ LoggerContext lc = (LoggerContext)
org.apache.logging.log4j.LogManager.getContext(false);
+
lc.getRootLogger().removeAppender(lc.getConfiguration().getAppender(mockAppender.getName()));
+ lc.updateLoggers();
capturedEvents = null;
MDC.clear();
super.tearDown();
diff --git
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/LoggerOutput.java
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/LoggerOutput.java
index eeb161e..610997c 100644
---
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/LoggerOutput.java
+++
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/util/LoggerOutput.java
@@ -21,16 +21,18 @@
package org.apache.bookkeeper.util;
import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import java.util.function.Consumer;
import java.util.stream.Collectors;
-import org.apache.log4j.Appender;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.NullAppender;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
@@ -44,13 +46,13 @@ import org.slf4j.event.LoggingEvent;
*/
public class LoggerOutput implements TestRule {
- private Appender logAppender;
- private ArgumentCaptor<org.apache.log4j.spi.LoggingEvent> logEventCaptor;
- private List<Consumer<List<LoggingEvent>>> logEventExpectations = new
ArrayList<>();
+ private NullAppender logAppender;
+ private ArgumentCaptor<LogEvent> logEventCaptor;
+ private final List<Consumer<List<LoggingEvent>>> logEventExpectations =
new ArrayList<>();
public void expect(Consumer<List<LoggingEvent>> expectation) {
if (logEventCaptor == null) {
- logEventCaptor =
ArgumentCaptor.forClass(org.apache.log4j.spi.LoggingEvent.class);
+ logEventCaptor = ArgumentCaptor.forClass(LogEvent.class);
}
logEventExpectations.add(expectation);
}
@@ -61,13 +63,16 @@ public class LoggerOutput implements TestRule {
@Override
public void evaluate() throws Throwable {
- logAppender = mock(Appender.class);
- Logger rootLogger = LogManager.getRootLogger();
- rootLogger.addAppender(logAppender);
+ LoggerContext lc = (LoggerContext)
LogManager.getContext(false);
+ logAppender =
spy(NullAppender.createAppender(UUID.randomUUID().toString()));
+ logAppender.start();
+ lc.getConfiguration().addAppender(logAppender);
+
lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(logAppender.getName()));
+ lc.updateLoggers();
try {
base.evaluate();
if (!logEventExpectations.isEmpty()) {
- verify(logAppender,
atLeastOnce()).doAppend(logEventCaptor.capture());
+ verify(logAppender,
atLeastOnce()).append(logEventCaptor.capture());
List<LoggingEvent> logEvents =
logEventCaptor.getAllValues().stream()
.map(LoggerOutput::toSlf4j)
.collect(Collectors.toList());
@@ -76,7 +81,8 @@ public class LoggerOutput implements TestRule {
}
}
} finally {
- rootLogger.removeAppender(logAppender);
+
lc.getRootLogger().removeAppender(lc.getConfiguration().getAppender(logAppender.getName()));
+ lc.updateLoggers();
logEventExpectations.clear();
logEventCaptor = null;
}
@@ -84,7 +90,7 @@ public class LoggerOutput implements TestRule {
};
}
- private static LoggingEvent toSlf4j(org.apache.log4j.spi.LoggingEvent
log4jEvent) {
+ private static LoggingEvent toSlf4j(LogEvent log4jEvent) {
return new LoggingEvent() {
@Override
public Level getLevel() {
@@ -113,7 +119,7 @@ public class LoggerOutput implements TestRule {
@Override
public String getMessage() {
- return log4jEvent.getRenderedMessage();
+ return log4jEvent.getMessage().getFormattedMessage();
}
@Override
@@ -128,7 +134,7 @@ public class LoggerOutput implements TestRule {
@Override
public long getTimeStamp() {
- return log4jEvent.getTimeStamp();
+ return log4jEvent.getTimeMillis();
}
@Override
diff --git a/dependencies.gradle b/dependencies.gradle
index 6806a42..a7bc5bf 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -59,7 +59,7 @@ depVersions = [
junit: "4.12",
junitFoundation: "11.0.0",
kerby: "1.1.1",
- log4j: "1.2.27",
+ log4j: "2.14.1",
lombok: "1.18.20",
lz4: "1.3.0",
mockito: "3.0.0",
@@ -126,7 +126,9 @@ depLibs = [
junit: "junit:junit:${depVersions.junit}",
junitFoundation:
"com.nordstrom.tools:junit-foundation:${depVersions.junitFoundation}",
kerbySimpleKdc: "org.apache.kerby:kerb-simplekdc:${depVersions.kerby}",
- log4j: "log4j:log4j:${depVersions.log4j}",
+ log4jSlf4jImpl:
"org.apache.logging.log4j:log4j-slf4j-impl:${depVersions.log4j}",
+ log4j12api: "org.apache.logging.log4j:log4j-1.2-api:${depVersions.log4j}",
+ log4jCore: "org.apache.logging.log4j:log4j-core:${depVersions.log4j}",
lombok: "org.projectlombok:lombok:${depVersions.lombok}",
lz4: "net.jpountz.lz4:lz4:${depVersions.lz4}",
metricsCore:
"io.dropwizard.metrics:metrics-core:${depVersions.dropwizard}",
@@ -151,7 +153,6 @@ depLibs = [
rocksDb: "org.rocksdb:rocksdbjni:${depVersions.rocksDb}",
slf4j: "org.slf4j:slf4j-api:${depVersions.slf4j}",
slf4jSimple: "org.slf4j:slf4j-simple:${depVersions.slf4j}",
- slf4jLog4j: "org.slf4j:slf4j-log4j12:${depVersions.slf4j}",
shrinkwrapImpl:
"org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:${depVersions.shrinkwrap}",
shrinkwrapApi:
"org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:${depVersions.shrinkwrap}",
snappy: "org.xerial.snappy:snappy-java:${depVersions.snappy}",
diff --git a/microbenchmarks/pom.xml b/microbenchmarks/pom.xml
index c0cfedd..dc00939 100644
--- a/microbenchmarks/pom.xml
+++ b/microbenchmarks/pom.xml
@@ -43,8 +43,16 @@
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>log4j-over-slf4j</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.bookkeeper</groupId>
diff --git a/pom.xml b/pom.xml
index cbe49e4..cbcd017 100644
--- a/pom.xml
+++ b/pom.xml
@@ -145,6 +145,7 @@
<junit.version>4.12</junit.version>
<libthrift.version>0.14.2</libthrift.version>
<lombok.version>1.18.20</lombok.version>
+ <log4j.version>2.14.1</log4j.version>
<lz4.version>1.3.0</lz4.version>
<mockito.version>3.0.0</mockito.version>
<netty.version>4.1.68.Final</netty.version>
@@ -242,14 +243,19 @@
<version>${slf4j.version}</version>
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j.version}</version>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ <version>${log4j.version}</version>
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>log4j-over-slf4j</artifactId>
- <version>${slf4j.version}</version>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>${log4j.version}</version>
</dependency>
<!-- commons dependencies -->
@@ -790,8 +796,13 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
<dependency>
diff --git a/stats/utils/build.gradle b/stats/utils/build.gradle
index b03ced3..39ff187 100644
--- a/stats/utils/build.gradle
+++ b/stats/utils/build.gradle
@@ -33,7 +33,7 @@ dependencies {
implementation depLibs.jacksonAnnotations
implementation depLibs.jcommander
implementation depLibs.reflections
- implementation depLibs.slf4jLog4j
+ implementation depLibs.log4j12api
implementation depLibs.snakeyaml
diff --git a/stream/distributedlog/io/dlfs/pom.xml
b/stream/distributedlog/io/dlfs/pom.xml
index 7818d45..31366ed 100644
--- a/stream/distributedlog/io/dlfs/pom.xml
+++ b/stream/distributedlog/io/dlfs/pom.xml
@@ -50,6 +50,14 @@
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git a/stream/server/build.gradle b/stream/server/build.gradle
index 7eb3510..76f966a 100644
--- a/stream/server/build.gradle
+++ b/stream/server/build.gradle
@@ -50,7 +50,7 @@ dependencies {
implementation depLibs.zookeeper
runtimeOnly depLibs.metricsCore
runtimeOnly depLibs.snappy
- runtimeOnly depLibs.slf4jLog4j
+ runtimeOnly depLibs.log4j12api
runtimeOnly depLibs.commonsBeanutils
runtimeOnly depLibs.vertxCore
runtimeOnly depLibs.vertxWeb
diff --git
a/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java
b/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java
index 3c83f56..2404f21 100644
---
a/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java
+++
b/tests/integration-tests-utils/src/main/java/org/apache/bookkeeper/tests/integration/utils/MavenClassLoader.java
@@ -71,14 +71,13 @@ public class MavenClassLoader implements AutoCloseable {
Optional<String> slf4jVersion =
Arrays.stream(resolver.resolve(mainArtifact)
.withTransitivity().asResolvedArtifact())
.filter((a) -> a.getCoordinate().getGroupId().equals("org.slf4j")
- &&
a.getCoordinate().getArtifactId().equals("slf4j-log4j12"))
+ &&
a.getCoordinate().getArtifactId().equals("slf4j-1.2-api"))
.map((a) -> a.getCoordinate().getVersion())
.findFirst();
List<MavenDependency> deps = Lists.newArrayList(
MavenDependencies.createDependency(
mainArtifact, ScopeType.COMPILE, false,
-
MavenDependencies.createExclusion("org.slf4j:slf4j-log4j12"),
MavenDependencies.createExclusion("log4j:log4j")));
if (slf4jVersion.isPresent()) {
deps.add(MavenDependencies.createDependency("org.slf4j:slf4j-simple:" +
slf4jVersion.get(),
diff --git a/tests/integration/cluster/build.gradle
b/tests/integration/cluster/build.gradle
index f90ff20..16e8fe6 100644
--- a/tests/integration/cluster/build.gradle
+++ b/tests/integration/cluster/build.gradle
@@ -37,7 +37,7 @@ dependencies {
testImplementation project(':stream:clients:java:kv')
testCompileOnly depLibs.lombok
- testImplementation depLibs.slf4jLog4j
+ testImplementation depLibs.log4j12api
testImplementation depLibs.testcontainers
testImplementation depLibs.commonsConfiguration
testAnnotationProcessor depLibs.lombok
diff --git a/tools/ledger/pom.xml b/tools/ledger/pom.xml
index 8a5f074f..8becea1 100644
--- a/tools/ledger/pom.xml
+++ b/tools/ledger/pom.xml
@@ -36,8 +36,18 @@
<version>${project.parent.version}</version>
</dependency>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
diff --git a/tools/perf/build.gradle b/tools/perf/build.gradle
index b3a68c3..b7d659e 100644
--- a/tools/perf/build.gradle
+++ b/tools/perf/build.gradle
@@ -43,7 +43,7 @@ dependencies {
implementation depLibs.commonsConfiguration
implementation depLibs.guava
implementation depLibs.jcommander
- implementation depLibs.slf4jLog4j
+ implementation depLibs.log4j12api
implementation depLibs.zookeeper
implementation depLibs.curatorFramework
implementation depLibs.protobuf
diff --git a/tools/stream/build.gradle b/tools/stream/build.gradle
index 6f23289..223f27e 100644
--- a/tools/stream/build.gradle
+++ b/tools/stream/build.gradle
@@ -41,7 +41,7 @@ dependencies {
implementation depLibs.commonsConfiguration
implementation depLibs.guava
implementation depLibs.jcommander
- implementation depLibs.slf4jLog4j
+ implementation depLibs.log4j12api
implementation depLibs.zookeeper
implementation depLibs.curatorFramework
implementation depLibs.protobuf