Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Logback-打印类名_Java_Logging_Logback_Logback Classic - Fatal编程技术网

Java Logback-打印类名

Java Logback-打印类名,java,logging,logback,logback-classic,Java,Logging,Logback,Logback Classic,我正在使用logback,但是, 而不是直接调用logger类, 我想要一个自定义类/包装器类来记录数据。 (这是用例所要求的)。 我想打印调用此包装器的源类名 类而不是包装器类。 我尝试用这个类登录,但它总是打印包装器类的类名 class MyAppLogTest { public static void main(String args[]) { String msg="Some Msg"; ApplicationLogger.logData( "MyAppLogTes

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

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

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

为此,您可以执行以下操作:

    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。

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

}

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


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

您说您尝试使用
this
类登录,您所说的
this
是指哪个类?你必须在问题中包含你的代码。它使您更清楚地了解了您的要求。添加了代码,谢谢。我想问您,使用此包装器要解决的潜在问题是什么?因为你(有点)在发明轮子。记录器本身通过一个简单的属性文件为您提供相同的服务。也许通过了解潜在的问题,我可以给你一个更好的答案谢谢@zaerymoghaddam,虽然它看起来像是一种创新,但我们在这个包装类中有一些定制(不能包含完整的代码),我们还希望避免类与日志API的直接交互。您的运行时环境是什么?您可以使用CDIAPI将记录器注入到类中吗?但如果是异常,这可能会起作用,但也应该涵盖非异常场景。从ApplicationLogger类打印时,我需要将“MyAppLogTest”记录为类名。这样我就可以记录调用applicationloggeroops的源类名,我重新阅读了代码,我的坏消息。但是为每个请求创建Throwable不是一种开销吗?特别是在卷很大的情况下。语句“我希望在日志中自动生成类名”与语句“我不介意额外的开销”。
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);
}