Log4j单件包装器的好处?

时间:2011-07-27 14:42:51

标签: java singleton log4j wrapper

我最近继承了一些Java代码,需要将它集成到我正在处理的项目中。我的项目是一个处理和转换XML消息的服务代理。在查看新代码时,我发现了以下日志记录类:

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class MyLogger {

    private static MyLogger instance = null;
    protected final static Logger log = Logger.getLogger(MyLogger.class);

    private MyLogger() {
        super();
    }

    public static MyLogger getInstance(){
        if(instance  == null){
            instance  = new MyLogger();
            BasicConfigurator.configure();
            log.setLevel(Level.ALL);
        }
        return instance;
    }

    public void info(String myclass, String msg) {
        log.info("[" + myclass + "] " + msg);

    }

    public void error(String myclass, String msg, Exception ce) {               
        log.error("[" + myclass + "] " + msg, ce);      
    }

    public void warning(String myclass, String msg) {
        log.warn("[" + myclass + "] " + msg);
    }    
}

这个类基本上用另一个单例包装log4j。我需要集成的类中的所有日志记录都是这样的:

public class MyClass {
   private final static MyLogger log = MyLogger.getInstance();
   private final static String myclass = MyClass.class.getName();

   ...

   log.info(myclass, "Information message...");   
}

我没有看到使用额外的类进行日志记录有任何明显的好处,因此我正在考虑重构此代码以删除MyLogger类并以下列方式登录:

import org.apache.log4j.Logger;

public class MyClass {
   private static Logger log = Logger.getLogger(MyClass.class);

   ...

   log.info("Information Message...");     
}

这将使整个项目的日志记录机制保持一致。在我这样做之前,我想知道使用我可能缺少的单例类包装Log4j是否有任何好处。谢谢!

编辑:感谢大家提供的有用答案 - 我从每个人那里获得了几个新的见解。接受内森休斯的答案,指出丢失的功能,让课程完好无损 - 我一直认为离开单身人士的最大缺点就是代码臃肿。我会把课堂弄糟。

4 个答案:

答案 0 :(得分:11)

摆脱它。使用这个怪异意味着所有通过它的日志记录将使用相同的记录器(MyLogger)和方法列出(这就是为什么其方法的参数包括被记录事物的类)。这意味着您不仅要为每个记录器调用添加任何类,方法和行号信息,而且不能像使用典型的log4j方法那样使用类作为记录器来对不同的包进行任何过滤。

这件东西是一块垃圾,没有它你会好些的。

答案 1 :(得分:4)

我能看到的唯一好处是可以很容易地将log4j实现与另一个日志记录实现交换出来,或者让日志记录执行更加自定义的操作,例如登录到您自己的数据库之一。

那就是说,我仍然会重构代码以直接使用log4j。或者,在我的情况下,更有可能使用SLF4J

答案 2 :(得分:3)

你继承的代码执行log4j所做的一件事是使事情非线程安全。由于getInstance()中没有锁定,因此您可以分发多个实例并打破代码的单例意图。

您也无法根据自己的行为设置每个班级的日志记录级别。

答案 3 :(得分:2)

我能说的唯一缺陷是,因为这个宣言:

protected final static Logger log = Logger.getLogger(MyLogger.class);

记录器基本上挂钩到对象MyLogger,所有记录信息/错误/警告等都将“链接”到MyLogger。您不知道哪个对象添加了日志记录信息,无论如何都没有。

我看到这个Singleton的唯一优势是:

  • 单一即时:您永远不必担心一直声明static final Logger实施。
  • 您不必担心您使用的Logger类型。可以仅在此Singleton类中更改Logger的类型。对日志记录的任何进一步更改仅在Singleton中完成。

我也在公司看过这个,但我不建议那种设置。而是使用SLF4J或Java Logging Framework。