0

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

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);
    }
}

问候

4

2 回答 2

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。

于 2017-12-14T18:19:53.527 回答
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 的另一种解决方案。

于 2017-12-15T13:31:19.947 回答