Logback - 打印classname

时间:2017-12-14 14:36:12

标签: java logging logback logback-classic

我正在使用logback但是, 而不是直接调用记录器类, 我想有一个自定义类/包装类来记录数据。 (这是用例所必需的)。 我想打印调用此包装器的源类名 类而不是包装类。 我尝试使用此类进行日志记录,但它始终打印包装类的className。

class MyAppLogTest {

 public static void main(String args[]) {

    String msg="Some Msg";
    ApplicationLogger.logData( "MyAppLogTest", "main",msg);
    }
}


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class ApplicationLogger {

private static Logger logger = null;

    static {
        logger = (Logger) LoggerFactory.getLogger(ApplicationLogger.class);

    }

 public static void logData(final String clazz, final String method,final String msg) { 
        logger.info(msg);
    }
}

此致

2 个答案:

答案 0 :(得分:1)

不是一个好的解决方案, 但是你可以从堆栈中提取调用类并在日志消息中使用。

要做到这一点,你可以这样做:

    final StringBuilder returnValue = new StringBuilder();
    final Throwable throwable = new Throwable();

    try
    {
        final StackTraceElement[] elements = throwable.getStackTrace();
        final String methodName;

        if ((elements != null) &&
            (elements.length > 2))
        {
            methodName = elements[2].getMethodName();

            returnValue.append(methodName);
            returnValue.append("()");
        }
    }
    catch (Exception ignoredException)
    {
        // use some default value.
    }

    return returnValue;

所需类别的索引可能不是2。

答案 1 :(得分:0)

我不确定是否有一种不错的直接方式来访问调用记录器的方法的名称。但我认为访问调用者的类名的解决方案可能是这样的(我没有时间运行它,但我认为它会起作用):

class MyAppLogTest {
    //    An static instance of your custom logger initialized with
    //    the class that would call it
    private static ApplicationLogger applicationLogger = new ApplicationLogger(MyAppLogTest.class);

    public static void main(String args[]) {
        String msg="Some Msg";
        applicationLogger.logData("main", msg);
    }
}


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class ApplicationLogger {

    private static Logger logger;
    private Class callingClass;

    public ApplicationLogger(Class callingClass) {
        this.callingClass = callingClass;
        this.logger = (Logger) LoggerFactory.getLogger(callingClass);
    }
}

public static void logData(final String method, final String msg) { 
    logger.info(method + "-" + msg);
}

}

如果同时访问方法名称非常重要,您可以向Method类添加另一个类型为ApplicationLogger的属性,并在构造函数中初始化它。然后,您可以为每个方法实例化记录器(这很容易成为性能瓶颈)并将当前方法作为该参数传递。

此外,我认为值得一看面向方面编程技术/库。也许你可以找到另一种基于AOP的解决方案来解决原始问题。