将Log4j记录器放入许多类中

时间:2011-10-17 20:04:08

标签: java log4j

我想在我的程序中为很少的类添加日志记录。我是否需要添加行来为每个需要记录器的类定义记录器(我想避免在我的程序中传递记录器对象。

public class SomeClass {
  static Logger logger = Logger.getLogger(SomeClass.class);
  .......

如果我这样做,我可以接听这个电话“知道”它的类(类似this.class 或者有其他方法可以做到这一点

3 个答案:

答案 0 :(得分:2)

我发现一个方便的替代方法是创建一个为您创建Loggers的抽象类:

public abstract class AbstractLoggingThing {
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    protected Logger getLog() {
        return log;
    }
}

然后按照惯例,从它继承的每个类都有一个正确配置的Logger,并且你不必在整个地方都有相同的,愚蠢的代码。项目中的大多数类都可以很容易地将它包含在它们的继承层次结构中,而对于那些不能出于任何原因的类,您仍然可以回归旧样式。您还可以添加不错的便利方法,如:

    protected void info(String message, Object... args) {
        // What goes here depends on your logging library
    }

答案 1 :(得分:1)

是的,您需要为每个类添加行。 如果你的记录器是静态的(就像你的例子那样),你需要每次像你一样指定类(SomeClass.class)。如果你使你的记录器非静态,那么你可以使用this.getClass(),这将更加剪切和粘贴友好:

public class SomeClass {
  private Logger logger = Logger.getLogger(this.getClass());
  .......

答案 2 :(得分:1)

不,你没有需要来做这件事,但这是一种惯用的做法,也是一种很好的做法。 Log4j是围绕这个假设构建的,人们将以这种方式使用它。它为您提供免费发布日志事件的位置,以及为整个记录器分支轻松管理日志级别。

理论上,你可以在多个类之间共享一个记录器,甚至只有一个全局; Logger是线程安全的,无论如何它都需要在附加对象时进行同步,因此您的性能不会受到影响。您也可以将其命名为任何名称,不需要使用类名。但是,由于我上面说的原因,不建议这样做。

此外,您不需要生成引用static,因为log4j认为您只能创建一个具有给定名称的记录器,您不会通过将其存储在实例中而浪费内存变量