0

我不想使用这样的东西:

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

有什么办法可以实现吗?

4

1 回答 1

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

使用这种方式:

  1. 用户对底层的日志功能一无所知
  2. 如果您不需要它,或者环境不允许,您总是可以提供一个虚拟记录器。
  3. 日志记录功能在整个应用程序中统一
  4. 类名和代码行在日志中正确显示。
  5. 您不能使用 Log4j 最有用的功能之一——按包/类名过滤。
于 2012-08-15T12:38:46.100 回答