Java logger that automatically determines caller's class name

后端 未结 21 808
礼貌的吻别
礼貌的吻别 2020-12-07 17:53
public static Logger getLogger() {
    final Throwable t = new Throwable();
    final StackTraceElement methodCaller = t.getStackTrace()[1];
    final Logger logger          


        
相关标签:
21条回答
  • 2020-12-07 18:34

    From reading through all the other feedback on this site, I created the following for use with Log4j:

    package com.edsdev.testapp.util;
    
    import java.util.concurrent.ConcurrentHashMap;
    
    import org.apache.log4j.Level;
    import org.apache.log4j.Priority;
    
    public class Logger extends SecurityManager {
    
    private static ConcurrentHashMap<String, org.apache.log4j.Logger> loggerMap = new ConcurrentHashMap<String, org.apache.log4j.Logger>();
    
    public static org.apache.log4j.Logger getLog() {
        String className = new Logger().getClassName();
        if (!loggerMap.containsKey(className)) {
            loggerMap.put(className, org.apache.log4j.Logger.getLogger(className));
        }
        return loggerMap.get(className);
    }
    public String getClassName() {
        return getClassContext()[3].getName();
    }
    public static void trace(Object message) {
        getLog().trace(message);
    }
    public static void trace(Object message, Throwable t) {
        getLog().trace(message, t);
    }
    public static boolean isTraceEnabled() {
        return getLog().isTraceEnabled();
    }
    public static void debug(Object message) {
        getLog().debug(message);
    }
    public static void debug(Object message, Throwable t) {
        getLog().debug(message, t);
    }
    public static void error(Object message) {
        getLog().error(message);
    }
    public static void error(Object message, Throwable t) {
        getLog().error(message, t);
    }
    public static void fatal(Object message) {
        getLog().fatal(message);
    }
    public static void fatal(Object message, Throwable t) {
        getLog().fatal(message, t);
    }
    public static void info(Object message) {
        getLog().info(message);
    }
    public static void info(Object message, Throwable t) {
        getLog().info(message, t);
    }
    public static boolean isDebugEnabled() {
        return getLog().isDebugEnabled();
    }
    public static boolean isEnabledFor(Priority level) {
        return getLog().isEnabledFor(level);
    }
    public static boolean isInfoEnabled() {
        return getLog().isInfoEnabled();
    }
    public static void setLevel(Level level) {
        getLog().setLevel(level);
    }
    public static void warn(Object message) {
        getLog().warn(message);
    }
    public static void warn(Object message, Throwable t) {
        getLog().warn(message, t);
    }
    

    }

    Now in your code all you need is

    Logger.debug("This is a test");
    

    or

    Logger.error("Look what happened Ma!", e);
    

    If you need more exposure to log4j methods, just delegate them from the Logger class listed above.

    0 讨论(0)
  • 2020-12-07 18:34

    This mechanism puts in a lot of extra effort at runtime.

    If you use Eclipse as your IDE, consider using Log4e. This handy plugin will generate logger declarations for you using your favourite logging framework. A fraction more effort at coding time, but much less work at runtime.

    0 讨论(0)
  • 2020-12-07 18:36

    I prefer creating a (static) Logger for each class (with it's explicit class name). I than use the logger as is.

    0 讨论(0)
提交回复
热议问题