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