You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2014/09/06 00:42:20 UTC

git commit: Prefer classes over names in LogManager.

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-809 260b903b0 -> f424c7be4


Prefer classes over names in LogManager.

  - Allows for specifying the ClassLoader in getContext().
  - Updated to use ReflectionUtil instead of getClassName(int).
  - Use Class instead of String methods where possible.
  - Refactor commonly repeated calls to LogManager.class.getName() into static field.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/f424c7be
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f424c7be
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f424c7be

Branch: refs/heads/LOG4J2-809
Commit: f424c7be4921bcde815398412a60f9a99a7b043e
Parents: 260b903
Author: Matt Sicker <ma...@apache.org>
Authored: Fri Sep 5 17:42:09 2014 -0500
Committer: Matt Sicker <ma...@apache.org>
Committed: Fri Sep 5 17:42:09 2014 -0500

----------------------------------------------------------------------
 .../org/apache/logging/log4j/LogManager.java    | 85 ++++++++++++--------
 1 file changed, 52 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f424c7be/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
index c67299c..0f866b8 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
@@ -31,6 +31,7 @@ import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.ProviderUtil;
+import org.apache.logging.log4j.util.ReflectionUtil;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -59,6 +60,9 @@ public class LogManager {
      */
     public static final String ROOT_LOGGER_NAME = Strings.EMPTY;
 
+    // for convenience
+    private static final String FQCN = LogManager.class.getName();
+
     /**
      * Scans the classpath to find all logging implementation. Currently, only one will
      * be used but this could be extended to allow multiple implementations to be used.
@@ -132,16 +136,6 @@ public class LogManager {
     }
 
     /**
-     * Gets the class name of the caller in the current stack at the given {@code depth}.
-     *
-     * @param depth a 0-based index in the current stack.
-     * @return a class name
-     */
-    private static String getClassName(final int depth) {
-        return new Throwable().getStackTrace()[depth].getClassName();
-    }
-
-    /**
      * Returns the current LoggerContext.
      * <p>
      * WARNING - The LoggerContext returned by this method may not be the LoggerContext used to create a Logger
@@ -150,7 +144,7 @@ public class LogManager {
      * @return  The current LoggerContext.
      */
     public static LoggerContext getContext() {
-        return factory.getContext(LogManager.class.getName(), null, null, true);
+        return factory.getContext(FQCN, null, null, true);
     }
 
     /**
@@ -163,7 +157,8 @@ public class LogManager {
      * @return a LoggerContext.
      */
     public static LoggerContext getContext(final boolean currentContext) {
-        return factory.getContext(LogManager.class.getName(), null, null, currentContext, null, null);
+        // TODO: would it be a terrible idea to try and find the caller ClassLoader here?
+        return factory.getContext(FQCN, null, null, currentContext, null, null);
     }
 
     /**
@@ -178,7 +173,7 @@ public class LogManager {
      * @return a LoggerContext.
      */
     public static LoggerContext getContext(final ClassLoader loader, final boolean currentContext) {
-        return factory.getContext(LogManager.class.getName(), loader, null, currentContext);
+        return factory.getContext(FQCN, loader, null, currentContext);
     }
 
     /**
@@ -195,7 +190,7 @@ public class LogManager {
      */
     public static LoggerContext getContext(final ClassLoader loader, final boolean currentContext,
                                            final Object externalContext) {
-        return factory.getContext(LogManager.class.getName(), loader, externalContext, currentContext);
+        return factory.getContext(FQCN, loader, externalContext, currentContext);
     }
 
     /**
@@ -212,7 +207,7 @@ public class LogManager {
      */
     public static LoggerContext getContext(final ClassLoader loader, final boolean currentContext,
                                            final URI configLocation) {
-        return factory.getContext(LogManager.class.getName(), loader, null, currentContext, configLocation, null);
+        return factory.getContext(FQCN, loader, null, currentContext, configLocation, null);
     }
 
 
@@ -231,8 +226,7 @@ public class LogManager {
      */
     public static LoggerContext getContext(final ClassLoader loader, final boolean currentContext,
                                            final Object externalContext, final URI configLocation) {
-        return factory.getContext(LogManager.class.getName(), loader, externalContext, currentContext, configLocation,
-            null);
+        return factory.getContext(FQCN, loader, externalContext, currentContext, configLocation, null);
     }
 
 
@@ -253,8 +247,7 @@ public class LogManager {
     public static LoggerContext getContext(final ClassLoader loader, final boolean currentContext,
                                            final Object externalContext, final URI configLocation,
                                            final String name) {
-        return factory.getContext(LogManager.class.getName(), loader, externalContext, currentContext, configLocation,
-            name);
+        return factory.getContext(FQCN, loader, externalContext, currentContext, configLocation, name);
     }
 
     /**
@@ -324,6 +317,7 @@ public class LogManager {
      * @param clazz
      *            The Class whose name should be used as the Logger name.
      * @return The Logger, created with a {@link StringFormatterMessageFactory}
+     * @throws UnsupportedOperationException if {@code clazz} is {@code null} and the calling class cannot be determined.
      * @see Logger#fatal(Marker, String, Object...)
      * @see Logger#fatal(String, Object...)
      * @see Logger#error(Marker, String, Object...)
@@ -339,7 +333,8 @@ public class LogManager {
      * @see StringFormatterMessageFactory
      */
     public static Logger getFormatterLogger(final Class<?> clazz) {
-        return getLogger(clazz != null ? clazz.getName() : getClassName(2), StringFormatterMessageFactory.INSTANCE);
+        return getLogger(clazz != null ? clazz : ReflectionUtil.getCallerClass(2),
+            StringFormatterMessageFactory.INSTANCE);
     }
 
     /**
@@ -354,6 +349,7 @@ public class LogManager {
      * @param value
      *            The value's whose class name should be used as the Logger name.
      * @return The Logger, created with a {@link StringFormatterMessageFactory}
+     * @throws UnsupportedOperationException if {@code value} is {@code null} and the calling class cannot be determined.
      * @see Logger#fatal(Marker, String, Object...)
      * @see Logger#fatal(String, Object...)
      * @see Logger#error(Marker, String, Object...)
@@ -369,8 +365,8 @@ public class LogManager {
      * @see StringFormatterMessageFactory
      */
     public static Logger getFormatterLogger(final Object value) {
-        return getLogger(value != null ? value.getClass().getName() : getClassName(2),
-                StringFormatterMessageFactory.INSTANCE);
+        return getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2),
+            StringFormatterMessageFactory.INSTANCE);
     }
 
     /**
@@ -384,6 +380,7 @@ public class LogManager {
      *
      * @param name The logger name. If null it will default to the name of the calling class.
      * @return The Logger, created with a {@link StringFormatterMessageFactory}
+     * @throws UnsupportedOperationException if {@code name} is {@code null} and the calling class cannot be determined.
      * @see Logger#fatal(Marker, String, Object...)
      * @see Logger#fatal(String, Object...)
      * @see Logger#error(Marker, String, Object...)
@@ -399,15 +396,17 @@ public class LogManager {
      * @see StringFormatterMessageFactory
      */
     public static Logger getFormatterLogger(final String name) {
-        return getLogger(name != null ? name : getClassName(2), StringFormatterMessageFactory.INSTANCE);
+        return name == null ? getFormatterLogger(ReflectionUtil.getCallerClass(2)) : getLogger(name,
+            StringFormatterMessageFactory.INSTANCE);
     }
 
     /**
      * Returns a Logger with the name of the calling class.
      * @return The Logger for the calling class.
+     * @throws UnsupportedOperationException if the calling class cannot be determined.
      */
     public static Logger getLogger() {
-        return getLogger(getClassName(2));
+        return getLogger(ReflectionUtil.getCallerClass(2));
     }
 
     /**
@@ -415,9 +414,17 @@ public class LogManager {
      * @param clazz The Class whose name should be used as the Logger name. If null it will default to the calling
      *              class.
      * @return The Logger.
+     * @throws UnsupportedOperationException if {@code clazz} is {@code null} and the calling class cannot be determined.
      */
     public static Logger getLogger(final Class<?> clazz) {
-        return getLogger(clazz != null ? clazz.getName() : getClassName(2));
+        if (clazz == null) {
+            final Class<?> candidate = ReflectionUtil.getCallerClass(2);
+            if (candidate == null) {
+                throw new UnsupportedOperationException("No class provided, and an appropriate one cannot be found.");
+            }
+            return getLogger(candidate);
+        }
+        return getContext(clazz.getClassLoader(), false).getLogger(clazz.getName());
     }
 
     /**
@@ -427,9 +434,17 @@ public class LogManager {
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
      * @return The Logger.
+     * @throws UnsupportedOperationException if {@code clazz} is {@code null} and the calling class cannot be determined.
      */
     public static Logger getLogger(final Class<?> clazz, final MessageFactory messageFactory) {
-        return getLogger(clazz != null ? clazz.getName() : getClassName(2), messageFactory);
+        if (clazz == null) {
+            final Class<?> candidate = ReflectionUtil.getCallerClass(2);
+            if (candidate == null) {
+                throw new UnsupportedOperationException("No class provided, and an appropriate one cannot be found.");
+            }
+            return getLogger(candidate, messageFactory);
+        }
+        return getContext(clazz.getClassLoader(), false).getLogger(clazz.getName(), messageFactory);
     }
 
     /**
@@ -437,9 +452,10 @@ public class LogManager {
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
      * @return The Logger for the calling class.
+     * @throws UnsupportedOperationException if the calling class cannot be determined.
      */
     public static Logger getLogger(final MessageFactory messageFactory) {
-        return getLogger(getClassName(2), messageFactory);
+        return getLogger(ReflectionUtil.getCallerClass(2), messageFactory);
     }
 
     /**
@@ -447,9 +463,10 @@ public class LogManager {
      * @param value The value whose class name should be used as the Logger name. If null the name of the calling
      *              class will be used as the logger name.
      * @return The Logger.
+     * @throws UnsupportedOperationException if {@code value} is {@code null} and the calling class cannot be determined.
      */
     public static Logger getLogger(final Object value) {
-        return getLogger(value != null ? value.getClass().getName() : getClassName(2));
+        return getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2));
     }
 
     /**
@@ -459,9 +476,10 @@ public class LogManager {
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
      * @return The Logger.
+     * @throws UnsupportedOperationException if {@code value} is {@code null} and the calling class cannot be determined.
      */
     public static Logger getLogger(final Object value, final MessageFactory messageFactory) {
-        return getLogger(value != null ? value.getClass().getName() : getClassName(2), messageFactory);
+        return getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2), messageFactory);
     }
 
     /**
@@ -469,10 +487,10 @@ public class LogManager {
      *
      * @param name The logger name. If null the name of the calling class will be used.
      * @return The Logger.
+     * @throws UnsupportedOperationException if {@code name} is {@code null} and the calling class cannot be determined.
      */
     public static Logger getLogger(final String name) {
-        final String actualName = name != null ? name : getClassName(2);
-        return factory.getContext(LogManager.class.getName(), null, null, false).getLogger(actualName);
+        return name != null ? getContext(false).getLogger(name) : getLogger(ReflectionUtil.getCallerClass(2));
     }
 
     /**
@@ -482,10 +500,11 @@ public class LogManager {
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
      * @return The Logger.
+     * @throws UnsupportedOperationException if {@code name} is {@code null} and the calling class cannot be determined.
      */
     public static Logger getLogger(final String name, final MessageFactory messageFactory) {
-        final String actualName = name != null ? name : getClassName(2);
-        return factory.getContext(LogManager.class.getName(), null, null, false).getLogger(actualName, messageFactory);
+        return name != null ? getContext(false).getLogger(name, messageFactory) : getLogger(
+            ReflectionUtil.getCallerClass(2), messageFactory);
     }
 
     /**