使用Log4j记录控制器/服务(集中记录)

时间:2012-08-15 09:14:53

标签: java logging log4j

我不想使用这样的东西:

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

有没有办法实现这个?

1 个答案:

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

使用这种方式:

  1. 用户对基础日志记录功能一无所知
  2. 如果您不需要虚拟记录器,或者环境不允许,您总是可以提供虚拟记录器。
  3. 日志记录功能在整个应用程序中统一
  4. 班级名称和代码行在日志中显示正确
  5. 您无法使用Log4j最有用的功能之一 - 按包/类名过滤。