我不想使用这样的东西:
Logger.getLogger(MyClass.class).info("Info message");
每次我想记录某事。
我尝试使用以下方法实现日志记录服务:
public void info(final Object aMessage, final Object aSender);
这允许我根据发送者的类获取Logger实例,但它隐藏了日志源类的方法和行。
我知道像AOP或Slf4j这样的替代品。第一个不是我想要的,第二个引入类似于第一行代码的东西:
LoggerFactory.getLogger(HelloWorld.class).info("Info message");
所以,我关心的不是隐藏Log4j依赖关系,而是关于统一整个应用程序的日志记录调用,如下所示:
//loggingController instance was injected previously
loggingControler.info("Info message",this);
有没有办法实现这个?
答案 0 :(得分:0)
好的,似乎至少有一种方法可以解决这个问题:
例如,有LoggingService和LoggingController。第一个直接使用Log4j,第二个只是服务和整个应用程序之间的一层。
public class LoggingService implements ILoggingService{
//other methods here.
@Override
public void warn(final Object aMessage, final Object aSender, final Throwable aThrowable) {
log(aMessage, aSender, Level.WARN, aThrowable);
}
private void log(final Object aMessage, final Object aSender, final Level aLevel, final Throwable aThrowable) {
final String className = getClassNameBy(aSender);
Logger.getLogger(className).log(className, aLevel, aMessage, aThrowable);
}
}
public class LoggingController implement ILoggingController{
//logging service is injected previously
@Override
public void warn(final Object aMessage, final Throwable aThrowable) {
loggingService.warn(aMessage, this, aThrowable);
}
}
因此,在这种情况下,您允许用户使用以下命令记录:
loggingController.warn("A warning", null);
使用这种方式: