You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2019/07/28 03:27:50 UTC

[logging-log4j2] branch master updated (f5810db -> 988f14e)

This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git.


    from f5810db  [LOG4J2-2660] Retry when JDBC throws a java.sql.SQLTransactionRollbackException in commitAndClose().
     new 0868bd1  LOG4J2-2556 - Make Log4j Core optional
     new 988f14e  LOG4J2-2556 - Make Log4j Core optional

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 log4j-1.2-api/pom.xml                              |  1 +
 .../src/main/java/org/apache/log4j/Category.java   | 82 +++++++++++++++-------
 .../src/main/java/org/apache/log4j/LogManager.java | 25 +++++--
 .../src/main/java/org/apache/log4j/Logger.java     |  2 +-
 .../org/apache/log4j/legacy/core/CategoryUtil.java | 65 +++++++++++++++++
 .../org/apache/log4j/legacy/core/ContextUtil.java  | 22 +++---
 log4j-1.2-api/src/site/markdown/index.md           | 17 ++++-
 .../test/java/org/apache/log4j/CategoryTest.java   |  4 +-
 .../src/test/java/org/apache/log4j/LoggerTest.java | 40 +++++------
 src/changes/changes.xml                            |  3 +
 src/site/asciidoc/runtime-dependencies.adoc        |  2 +-
 11 files changed, 196 insertions(+), 67 deletions(-)
 create mode 100644 log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
 copy log4j-core/src/test/java/org/apache/logging/log4j/test/SomethingThatUsesLogging.java => log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/ContextUtil.java (65%)


[logging-log4j2] 02/02: LOG4J2-2556 - Make Log4j Core optional

Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 988f14e2c43fa023e1b8097a055d1bc50604e865
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sat Jul 27 20:27:22 2019 -0700

    LOG4J2-2556 - Make Log4j Core optional
---
 src/changes/changes.xml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f33715c..5b2444b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -142,6 +142,9 @@
       </action>
     </release>
     <release version="2.12.1" date="2019-MM-DD" description="GA Release 2.12.1">
+      <action issue="LOG4J2-2556" dev="rgoers" type="update">
+        Make Log4j Core optional for Log4j 1.2 API.
+      </action>
       <action issue="LOG4J2-2575" dev="rgoers" type="fix" due-to="Nathan Friess">
         CronExpression.getBeforeTime() would sometimes return incorrect result.
       </action>


[logging-log4j2] 01/02: LOG4J2-2556 - Make Log4j Core optional

Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 0868bd1a0a033db5210615d0158aa27ace75c863
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sat Jul 27 20:23:30 2019 -0700

    LOG4J2-2556 - Make Log4j Core optional
---
 log4j-1.2-api/pom.xml                              |  1 +
 .../src/main/java/org/apache/log4j/Category.java   | 82 +++++++++++++++-------
 .../src/main/java/org/apache/log4j/LogManager.java | 25 +++++--
 .../src/main/java/org/apache/log4j/Logger.java     |  2 +-
 .../org/apache/log4j/legacy/core/CategoryUtil.java | 65 +++++++++++++++++
 .../org/apache/log4j/legacy/core/ContextUtil.java  | 34 +++++++++
 log4j-1.2-api/src/site/markdown/index.md           | 17 ++++-
 .../test/java/org/apache/log4j/CategoryTest.java   |  4 +-
 .../src/test/java/org/apache/log4j/LoggerTest.java | 40 +++++------
 src/site/asciidoc/runtime-dependencies.adoc        |  2 +-
 10 files changed, 217 insertions(+), 55 deletions(-)

diff --git a/log4j-1.2-api/pom.xml b/log4j-1.2-api/pom.xml
index c421276..65d81cb 100644
--- a/log4j-1.2-api/pom.xml
+++ b/log4j-1.2-api/pom.xml
@@ -63,6 +63,7 @@
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
+      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
index c06c5f2..1da4560 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
@@ -24,9 +24,10 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.log4j.helpers.NullEnumeration;
+import org.apache.log4j.legacy.core.CategoryUtil;
 import org.apache.log4j.spi.LoggerFactory;
 import org.apache.log4j.spi.LoggingEvent;
-import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.util.NameUtil;
 import org.apache.logging.log4j.message.LocalizedMessage;
 import org.apache.logging.log4j.message.Message;
@@ -47,12 +48,26 @@ public class Category {
 
     private static final String FQCN = Category.class.getName();
 
+    private static final boolean isCoreAvailable;
+
+
+    static {
+        boolean available;
+
+        try {
+            available = Class.forName("org.apache.logging.log4j.core.Logger") != null;
+        } catch (Exception ex) {
+            available = false;
+        }
+        isCoreAvailable = available;
+    }
+
     /**
      * Resource bundle for localized messages.
      */
     protected ResourceBundle bundle = null;
 
-    private final org.apache.logging.log4j.core.Logger logger;
+    private final org.apache.logging.log4j.Logger logger;
 
     /**
      * Constructor used by Logger to specify a LoggerContext.
@@ -71,7 +86,7 @@ public class Category {
         this(PrivateManager.getContext(), name);
     }
 
-    private Category(final org.apache.logging.log4j.core.Logger logger) {
+    private Category(final org.apache.logging.log4j.Logger logger) {
         this.logger = logger;
     }
 
@@ -117,16 +132,20 @@ public class Category {
         return logger.getName();
     }
 
-    org.apache.logging.log4j.core.Logger getLogger() {
+    org.apache.logging.log4j.Logger getLogger() {
         return logger;
     }
 
     public final Category getParent() {
-        final org.apache.logging.log4j.core.Logger parent = logger.getParent();
-        if (parent == null) {
+        if (!isCoreAvailable) {
             return null;
         }
-        final ConcurrentMap<String, Logger> loggers = getLoggersMap(logger.getContext());
+        org.apache.logging.log4j.Logger parent = CategoryUtil.getParent(logger);
+        LoggerContext loggerContext = CategoryUtil.getLoggerContext(logger);
+        if (parent == null || loggerContext == null) {
+            return null;
+        }
+        final ConcurrentMap<String, Logger> loggers = getLoggersMap(loggerContext);
         final Logger l = loggers.get(parent.getName());
         return l == null ? new Category(parent) : l;
     }
@@ -182,8 +201,6 @@ public class Category {
             return Level.ERROR;
         case FATAL:
             return Level.FATAL;
-        case OFF:
-            return Level.OFF;
         default:
             // TODO Should this be an IllegalStateException?
             return Level.OFF;
@@ -199,7 +216,7 @@ public class Category {
     }
 
     public void setLevel(final Level level) {
-        logger.setLevel(org.apache.logging.log4j.Level.toLevel(level.levelStr));
+        setLevel(level.levelStr);
     }
 
     public final Level getPriority() {
@@ -207,7 +224,13 @@ public class Category {
     }
 
     public void setPriority(final Priority priority) {
-        logger.setLevel(org.apache.logging.log4j.Level.toLevel(priority.levelStr));
+        setLevel(priority.levelStr);
+    }
+
+    private void setLevel(final String levelStr) {
+        if (isCoreAvailable) {
+            CategoryUtil.setLevel(logger, org.apache.logging.log4j.Level.toLevel(levelStr));
+        }
     }
 
     public void debug(final Object message) {
@@ -354,7 +377,7 @@ public class Category {
     public void forcedLog(final String fqcn, final Priority level, final Object message, final Throwable t) {
         final org.apache.logging.log4j.Level lvl = org.apache.logging.log4j.Level.toLevel(level.toString());
         final Message msg = message instanceof Message ? (Message) message : new ObjectMessage(message);
-        logger.logMessage(fqcn, lvl, null, msg, t);
+        logger.logMessage(lvl, null, fqcn, null, msg, t);
     }
 
     public boolean exists(final String name) {
@@ -362,11 +385,13 @@ public class Category {
     }
 
     public boolean getAdditivity() {
-        return logger.isAdditive();
+        return isCoreAvailable ? CategoryUtil.isAdditive(logger) : false;
     }
 
     public void setAdditivity(final boolean additivity) {
-        logger.setAdditive(additivity);
+        if (isCoreAvailable) {
+            CategoryUtil.setAdditivity(logger, additivity);
+        }
     }
 
     public void setResourceBundle(final ResourceBundle bundle) {
@@ -378,13 +403,18 @@ public class Category {
             return bundle;
         }
         String name = logger.getName();
-        final ConcurrentMap<String, Logger> loggers = getLoggersMap(logger.getContext());
-        while ((name = NameUtil.getSubName(name)) != null) {
-            final Logger subLogger = loggers.get(name);
-            if (subLogger != null) {
-				final ResourceBundle rb = subLogger.bundle;
-                if (rb != null) {
-                    return rb;
+        if (isCoreAvailable) {
+            LoggerContext ctx = CategoryUtil.getLoggerContext(logger);
+            if (ctx != null) {
+                final ConcurrentMap<String, Logger> loggers = getLoggersMap(ctx);
+                while ((name = NameUtil.getSubName(name)) != null) {
+                    final Logger subLogger = loggers.get(name);
+                    if (subLogger != null) {
+                        final ResourceBundle rb = subLogger.bundle;
+                        if (rb != null) {
+                            return rb;
+                        }
+                    }
                 }
             }
         }
@@ -448,8 +478,8 @@ public class Category {
 
     private void maybeLog(final String fqcn, final org.apache.logging.log4j.Level level,
             final Object message, final Throwable throwable) {
-        if (logger.isEnabled(level, null, message, throwable)) {
-            logger.logMessage(FQCN, level, null, new ObjectMessage(message), throwable);
+        if (logger.isEnabled(level)) {
+            logger.logMessage(level, null, fqcn, null, new ObjectMessage(message), throwable);
         }
     }
 
@@ -457,7 +487,7 @@ public class Category {
 
         @Override
         protected Logger newLogger(final String name, final org.apache.logging.log4j.spi.LoggerContext context) {
-            return new Logger((LoggerContext) context, name);
+            return new Logger(context, name);
         }
 
         @Override
@@ -473,7 +503,7 @@ public class Category {
         private static final String FQCN = Category.class.getName();
 
         public static LoggerContext getContext() {
-            return (LoggerContext) getContext(FQCN, false);
+            return getContext(FQCN, false);
         }
 
         public static org.apache.logging.log4j.Logger getLogger(final String name) {
@@ -482,7 +512,7 @@ public class Category {
     }
 
     private boolean isEnabledFor(final org.apache.logging.log4j.Level level) {
-        return logger.isEnabled(level, null, null);
+        return logger.isEnabled(level);
     }
 
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
index 751cb86..a4b6802 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
@@ -19,11 +19,12 @@ package org.apache.log4j;
 import java.util.Enumeration;
 
 import org.apache.log4j.helpers.NullEnumeration;
+import org.apache.log4j.legacy.core.ContextUtil;
 import org.apache.log4j.spi.HierarchyEventListener;
 import org.apache.log4j.spi.LoggerFactory;
 import org.apache.log4j.spi.LoggerRepository;
 import org.apache.log4j.spi.RepositorySelector;
-import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -63,6 +64,20 @@ public final class LogManager {
 
     private static final LoggerRepository REPOSITORY = new Repository();
 
+    private static final boolean isLog4jCore;
+
+    static {
+        boolean core = false;
+        try {
+            if (Class.forName("org.apache.logging.log4j.core.LoggerContext") != null) {
+                core = true;
+            }
+        } catch (Exception ex) {
+            // Ignore the exception;
+        }
+        isLog4jCore = core;
+    }
+
     private LogManager() {
     }
 
@@ -96,8 +111,10 @@ public final class LogManager {
     }
 
     static void reconfigure() {
-        final LoggerContext ctx = PrivateManager.getContext();
-        ctx.reconfigure();
+        if (isLog4jCore) {
+            final LoggerContext ctx = PrivateManager.getContext();
+            ContextUtil.reconfigure(ctx);
+        }
     }
 
     /**
@@ -212,7 +229,7 @@ public final class LogManager {
         private static final String FQCN = LogManager.class.getName();
 
         public static LoggerContext getContext() {
-            return (LoggerContext) getContext(FQCN, false);
+            return getContext(FQCN, false);
         }
 
         public static org.apache.logging.log4j.Logger getLogger(final String name) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java
index fb7277b..c228338 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java
@@ -18,7 +18,7 @@ package org.apache.log4j;
 
 
 import org.apache.log4j.spi.LoggerFactory;
-import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.spi.LoggerContext;
 
 /**
  *
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java b/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
new file mode 100644
index 0000000..f9e9f7c
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
@@ -0,0 +1,65 @@
+/*
+ * 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.log4j.legacy.core;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.spi.LoggerContext;
+
+/**
+ * Provide access to Log4j Core Logger methods.
+ */
+public final class CategoryUtil {
+
+    private CategoryUtil() {
+    }
+
+    public static boolean isAdditive(Logger logger) {
+        if (logger instanceof org.apache.logging.log4j.core.Logger) {
+            return ((org.apache.logging.log4j.core.Logger) logger).isAdditive();
+        }
+        return false;
+    }
+
+    public static void setAdditivity(Logger logger, boolean additivity) {
+        if (logger instanceof org.apache.logging.log4j.core.Logger) {
+            ((org.apache.logging.log4j.core.Logger) logger).setAdditive(additivity);
+        }
+    }
+
+    public static Logger getParent(Logger logger) {
+        if (logger instanceof org.apache.logging.log4j.core.Logger) {
+            return ((org.apache.logging.log4j.core.Logger) logger).getParent();
+
+        }
+        return null;
+    }
+
+    public static LoggerContext getLoggerContext(Logger logger) {
+        if (logger instanceof org.apache.logging.log4j.core.Logger) {
+            return ((org.apache.logging.log4j.core.Logger) logger).getContext();
+        }
+        return null;
+    }
+
+    public static void setLevel(Logger logger, Level level) {
+        if (logger instanceof org.apache.logging.log4j.core.Logger) {
+            ((org.apache.logging.log4j.core.Logger) logger).setLevel(level);
+
+        }
+    }
+}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/ContextUtil.java b/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/ContextUtil.java
new file mode 100644
index 0000000..d3b99fa
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/ContextUtil.java
@@ -0,0 +1,34 @@
+/*
+ * 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.log4j.legacy.core;
+
+import org.apache.logging.log4j.spi.LoggerContext;
+
+/**
+ * Implements LoggerContext methods specific to log4j-core.
+ */
+public final class ContextUtil {
+
+    private ContextUtil() {
+    }
+
+    public static void reconfigure(LoggerContext ctx) {
+        if (ctx instanceof org.apache.logging.log4j.core.LoggerContext) {
+            ((org.apache.logging.log4j.core.LoggerContext) ctx).reconfigure();
+        }
+    }
+}
diff --git a/log4j-1.2-api/src/site/markdown/index.md b/log4j-1.2-api/src/site/markdown/index.md
index a80e687..01d5a76 100644
--- a/log4j-1.2-api/src/site/markdown/index.md
+++ b/log4j-1.2-api/src/site/markdown/index.md
@@ -23,7 +23,22 @@ Log4j 2 instead.
 
 ## Requirements
 
-The Log4j 1.2 bridge is dependent on the Log4j 2 API and implementation.
+The Log4j 1.2 bridge is dependent on the Log4j 2 API. The following Log4j 1.x methods will behave differently when
+the Log4j 2 Core module is included then when it is not:
+
+| Method                        | Without log4j-core | With log4j-core                      |
+| ----------------------------- | ------------------ | ------------------------------------ |
+| Category.getParent()          | Returns null       | Returns parent logger                |
+| Category.setLevel()           | NoOp               | Sets Logger Level                    |
+| Category.setPriority()        | NoOp               | Sets Logger Level                    | 
+| Category.getAdditivity()      | Returns false      | Returns Logger's additivity setting  | 
+| Category.setAdditivity()      | NoOp               | Sets additivity of LoggerConfig      |
+| Category.getResourceBundle()  | NoOp               | Returns the resource bundle associated with the Logger |
+| BasicConfigurator.configure() | NoOp               | Reconfigures Log4j 2                 |
+
+If log4j-core is not present location information will not be accurate in calls using the Log4j 1.2 API. The config
+package which attempts tp convert Log4j 1.x configurations to Log4j 2 is not supported without Log4j 2.  
+
 For more information, see [Runtime Dependencies](../runtime-dependencies.html).
 
 ## Usage
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
index b3d73f8..a16f2a3 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
@@ -74,7 +74,7 @@ public class CategoryTest {
     public void testForcedLog() {
         final MockCategory category = new MockCategory("org.example.foo");
         category.setAdditivity(false);
-        category.getLogger().addAppender(appender);
+        ((org.apache.logging.log4j.core.Logger) category.getLogger()).addAppender(appender);
         category.info("Hello, World");
         final List<LogEvent> list = appender.getEvents();
         int events = list.size();
@@ -172,7 +172,7 @@ public class CategoryTest {
         final ListAppender appender = new ListAppender("List2", null, layout, false, false);
         appender.start();
         category.setAdditivity(false);
-        category.getLogger().addAppender(appender);
+        ((org.apache.logging.log4j.core.Logger) category.getLogger()).addAppender(appender);
         category.error("Test Message");
         final List<String> msgs = appender.getMessages();
         assertTrue("Incorrect number of messages. Expected 1 got " + msgs.size(), msgs.size() == 1);
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
index 37d2572..1742422 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
@@ -122,7 +122,7 @@ public class LoggerTest {
         final CountingAppender coutingAppender = new CountingAppender();
         coutingAppender.start();
         try {
-            loggerA.getLogger().addAppender(coutingAppender);
+            ((org.apache.logging.log4j.core.Logger) loggerA.getLogger()).addAppender(coutingAppender);
 
             assertEquals(0, coutingAppender.counter);
             loggerAB.debug(MSG);
@@ -135,7 +135,7 @@ public class LoggerTest {
             assertEquals(4, coutingAppender.counter);
             coutingAppender.stop();
         } finally {
-            loggerA.getLogger().removeAppender(coutingAppender);
+            ((org.apache.logging.log4j.core.Logger) loggerA.getLogger()).removeAppender(coutingAppender);
         }
     }
 
@@ -155,8 +155,8 @@ public class LoggerTest {
         ca2.start();
 
         try {
-            a.getLogger().addAppender(ca1);
-            abc.getLogger().addAppender(ca2);
+            ((org.apache.logging.log4j.core.Logger) a.getLogger()).addAppender(ca1);
+            ((org.apache.logging.log4j.core.Logger) abc.getLogger()).addAppender(ca2);
 
             assertEquals(ca1.counter, 0);
             assertEquals(ca2.counter, 0);
@@ -175,8 +175,8 @@ public class LoggerTest {
             ca1.stop();
             ca2.stop();
         } finally {
-            a.getLogger().removeAppender(ca1);
-            abc.getLogger().removeAppender(ca2);
+            ((org.apache.logging.log4j.core.Logger) a.getLogger()).removeAppender(ca1);
+            ((org.apache.logging.log4j.core.Logger) abc.getLogger()).removeAppender(ca2);
         }}
 
     /**
@@ -197,9 +197,9 @@ public class LoggerTest {
         final CountingAppender caABC = new CountingAppender();
         caABC.start();
         try {
-            root.getLogger().addAppender(caRoot);
-            a.getLogger().addAppender(caA);
-            abc.getLogger().addAppender(caABC);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).addAppender(caRoot);
+            ((org.apache.logging.log4j.core.Logger) a.getLogger()).addAppender(caA);
+            ((org.apache.logging.log4j.core.Logger) abc.getLogger()).addAppender(caABC);
 
             assertEquals(caRoot.counter, 0);
             assertEquals(caA.counter, 0);
@@ -225,9 +225,9 @@ public class LoggerTest {
             caA.stop();
             caABC.stop();
         } finally {
-            root.getLogger().removeAppender(caRoot);
-            a.getLogger().removeAppender(caA);
-            abc.getLogger().removeAppender(caABC);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).removeAppender(caRoot);
+            ((org.apache.logging.log4j.core.Logger) a.getLogger()).removeAppender(caA);
+            ((org.apache.logging.log4j.core.Logger) abc.getLogger()).removeAppender(caABC);
         }}
 
     /* Don't support getLoggerRepository
@@ -390,7 +390,7 @@ public class LoggerTest {
         final ListAppender appender = new ListAppender("List");
         appender.start();
         final Logger root = Logger.getRootLogger();
-        root.getLogger().addAppender(appender);
+        ((org.apache.logging.log4j.core.Logger) root.getLogger()).addAppender(appender);
         root.setLevel(Level.INFO);
 
         final Logger tracer = Logger.getLogger("com.example.Tracer");
@@ -406,7 +406,7 @@ public class LoggerTest {
         assertEquals(org.apache.logging.log4j.Level.TRACE, event.getLevel());
         assertEquals("Message 1", event.getMessage().getFormat());
         appender.stop();
-        root.getLogger().removeAppender(appender);
+        ((org.apache.logging.log4j.core.Logger) root.getLogger()).removeAppender(appender);
     }
 
     /**
@@ -418,7 +418,7 @@ public class LoggerTest {
         appender.start();
         final Logger root = Logger.getRootLogger();
         try {
-            root.getLogger().addAppender(appender);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).addAppender(appender);
             root.setLevel(Level.INFO);
 
             final Logger tracer = Logger.getLogger("com.example.Tracer");
@@ -436,7 +436,7 @@ public class LoggerTest {
             assertEquals("Message 1", event.getMessage().getFormattedMessage());
             appender.stop();
         } finally {
-            root.getLogger().removeAppender(appender);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).removeAppender(appender);
         }
     }
 
@@ -449,7 +449,7 @@ public class LoggerTest {
         appender.start();
         final Logger root = Logger.getRootLogger();
         try {
-            root.getLogger().addAppender(appender);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).addAppender(appender);
             root.setLevel(Level.INFO);
 
             final Logger tracer = Logger.getLogger("com.example.Tracer");
@@ -459,7 +459,7 @@ public class LoggerTest {
             assertFalse(root.isTraceEnabled());
             appender.stop();
         } finally {
-            root.getLogger().removeAppender(appender);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).removeAppender(appender);
         }
     }
 
@@ -471,7 +471,7 @@ public class LoggerTest {
         appender.start();
         final Logger root = Logger.getRootLogger();
         try {
-            root.getLogger().addAppender(appender);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).addAppender(appender);
             root.setLevel(Level.INFO);
             final MyLogger log = new MyLogger(root);
             log.logInfo("This is a test", null);
@@ -483,7 +483,7 @@ public class LoggerTest {
             assertTrue("Message contains incorrect class name: " + msg, msg.contains(LoggerTest.class.getName()));
             appender.stop();
         } finally {
-            root.getLogger().removeAppender(appender);
+            ((org.apache.logging.log4j.core.Logger) root.getLogger()).removeAppender(appender);
         }
     }
 
diff --git a/src/site/asciidoc/runtime-dependencies.adoc b/src/site/asciidoc/runtime-dependencies.adoc
index 2ad8732..c0407f7 100644
--- a/src/site/asciidoc/runtime-dependencies.adoc
+++ b/src/site/asciidoc/runtime-dependencies.adoc
@@ -213,7 +213,7 @@ For details see the file https://github.com/zeromq/jeromq/blob/master/LICENSE[LI
 
 |log4j-1.2-api[[log4j-1.2-api]]
 |The link:log4j-1.2-api/index.html[Log4j 1.2 Bridge] has no external
-dependencies. This only requires the Log4j API and Log4j Core.
+dependencies. This only requires the Log4j API. Including Log4j Core provides optional, extra functionality.
 
 |log4j-api-scala[[log4j-api-scala]]
 |The Log4j link:manual/scala-api.html[Scala API] requires Scala runtime