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 <[email protected]> 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
