Log4J:创建记录器实例的策略

2022-08-31 14:01:03

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

  • 每个类一个记录器实例,例如

    class Foo {
        private static final Logger log = Logger.getLogger(Foo.class);
    }
    
  • 每个线程一个记录器实例
  • 每个应用程序一个记录器实例
  • 水平切片:应用程序的每一层(例如视图层,控制器层和持久性层)中的Logger实例
  • 垂直切片:应用程序功能分区中的一个记录器实例

注意:这些问题在以下文章中已经在某种程度上进行了讨论:

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


答案 1

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

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

...您最不希望看到的是日志记录设置中的错误假设。

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


答案 2

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

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

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

上述内容会将所有 apache 库代码设置为级别,将日志记录从您自己的代码切换到级别,详细包除外。INFODEBUG


推荐