我正在使用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);
}
}
问候
不是一个很好的解决方案,但是您可以从堆栈中拉出调用类并在日志消息中使用。
为此,您可以做这样的事情:
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个。
我不确定是否有一种不错而直接的方法来访问称为记录器的方法的名称。但是我认为可以访问呼叫者的类名的解决方案可能是这样的(我没有时间运行它,但我认为它会起作用):
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找到另一个解决方案。