Log4J:创建 Logger 实例的策略

新手上路,请多包涵

我决定为一个新的 Java 项目使用 Log4J 日志记录框架。我想知道我应该使用什么策略来创建/管理 Logger 实例,为什么?

  • 每个类一个 Logger 实例,例如
  class Foo {
      private static final Logger log = Logger.getLogger(Foo.class);
  }

  • 每个线程一个 Logger 实例
  • 每个应用程序一个 Logger 实例
  • 水平切片:应用程序的每一层(例如视图层、控制器层和持久层)中的一个 Logger 实例
  • 垂直切片:应用程序功能分区中的一个 Logger 实例

注意:这些文章已经在某种程度上考虑了这个问题:

创建 Log4j 记录器的开销是多少

原文由 Adrian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 556
2 个回答

通常,您会为每个类设置记录器,因为这是一个很好的逻辑组件。线程已经是日志消息的一部分(如果您的过滤器显示它们)因此以这种方式切片记录器可能是多余的。

关于基于应用程序或层的记录器,问题是您必须找到一个地方来粘贴该 Logger 对象。没什么大不了的。更大的问题是某些类可能在多个应用程序的多个级别上使用……可能很难让您的记录器正确。或者至少是棘手的。

…您最不想要的是日志记录设置中的错误假设。

如果您关心应用程序和层并且有简单的分离点,那么 NDC 是您的不二之选。代码有时可能有点过分,但我不知道有多少次我被一个准确的上下文堆栈保存了下来,显示我 Foo.bar() 是从 Y 层的应用程序 X 调用的。

原文由 PSpeed 发布,翻译遵循 CC BY-SA 2.5 许可协议

最常用的策略是为每个类创建一个记录器。如果您创建新线程,请给它们起一个有用的名称,以便它们的日志记录很容易区分。

为每个类创建记录器的好处是能够在类的包结构中打开/关闭日志记录:

 log4j.logger.org.apache = INFO
log4j.logger.com.example = DEBUG
log4j.logger.com.example.verbose = ERROR

以上会将所有 apache 库代码设置为 INFO 级别,将日志记录从您自己的代码切换到 DEBUG 级别,但 verbose 包除外。

原文由 rsp 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题