创建记录器时如何避免重复自己?

时间:2012-03-30 15:31:04

标签: java logging

我认为创建java.util.logging.Logger实例的常用习惯是:

public class SomeClassName {

    private static final Logger LOG = Logger.getLogger(SomeClassName.class.getName());

}

当我重构代码时,我的IDE将管理相应的更改行(例如,更改类的名称)。不过,我仍然不得不重复我的课程名称。我真正想做的是Logger.getLogger(getName())Logger.getLogger(class.getName()),但这不是静态启动中的合法Java。

有没有更好的方法来获取不涉及重复自己的记录器?

5 个答案:

答案 0 :(得分:10)

Issue 137 of The Java Specialists' Newsletter处理此问题。它建议应用记录器工厂,它可以检测实际的类名,例如通过生成异常并分析调用堆栈。

我个人认为这比原来的问题更糟糕,但这只是我的2美分。无论如何,技术上它很有趣,所以这里是:

public class LoggerFactory {
  public static Logger make() {
    Throwable t = new Throwable();
    StackTraceElement directCaller = t.getStackTrace()[1];
    return Logger.getLogger(directCaller.getClassName());
  }
}

...

public class BetterApplication {
  private final static Logger logger = LoggerFactory.make();

  ...
}

答案 1 :(得分:8)

我创建了一个Eclipse代码模板并且每次都使用它。

enter image description here

您只需键入logger并按 Ctrl + Space 即可将其激活。

答案 2 :(得分:1)

我们这样做:

private Logger log = Logger.getLogger(this.getClass());

答案 3 :(得分:1)

我使用一个名为log4e的插件,这对于记录非常方便。

http://log4e.jayefem.de/

您可以使用它在记录方法或整个班级之前/之后自动添加 您还可以使用记录器语句自动替换System.out.println 非常方便。

答案 4 :(得分:0)

有一个技巧可以从static上下文中获取当前类的名称,我不能从内存中引用它,但它涉及在静态块中抛出异常并读取堆栈跟踪以获取名称班上的。然而,这是一个非常黑客,所以在实践中我发现重复自己比玩这样的技巧更好。