【问题标题】:How do you avoid repeating yourself when creating a logger?创建记录器时如何避免重复自己?
【发布时间】:2012-04-14 07:40:58
【问题描述】:

我认为创建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。

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

【问题讨论】:

  • Logger logger = new logger.getLogger - 我会更担心即将到来的 logpocalypse!
  • 仅供参考,请参阅sl4j FAQ 中的解释,不同的框架但可能相同的理由。
  • 谢谢,@assylias!该常见问题解答非常清楚地解决了我的具体问题。即“上述记录器声明习语不抵抗类之间的剪切和粘贴”。但是,它没有提供解决方案。

标签: java logging


【解决方案1】:

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

  ...
}

【讨论】:

  • 这解决了我的具体问题,但我同意它比原来的问题更糟糕,我不会在我的代码中使用它。不过,感谢您提供的……有趣的解决方案! :)
【解决方案2】:

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

您只需输入logger 并按Ctrl + Space 即可激活它。

【讨论】:

  • 我不认为这是被问到的,因为 OP 特别提到他的 IDE 为他管理这个。
  • 我认为代码模板提示是有效的,因为 OP 提到他的 IDE 管理对类名的更改,而不是行的原始生成。
  • PS 您现在可以在 Eclipse 代码模板中包含导入 - 使其更加容易。
  • 这并没有解决我的具体担忧,即在这种情况下重复自己会使您容易受到复制粘贴错误的影响。这与我目前所做的类似。我的类模板中有一个静态记录器实例化。不过,我认为你的方式更好。在我知道我需要它之前,我不必添加实例。
【解决方案3】:

我们这样做:

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

【讨论】:

    【解决方案4】:

    我使用了一个名为 log4e 的插件,它可以方便地进行日志记录。

    http://log4e.jayefem.de/

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        相关资源
        最近更新 更多