为什么我们需要为每个类创建日志记录器?

13

许多论坛和 StackOverflow 的帖子都建议按类创建日志记录器。

快速查看 Log4j 的 getLogger(String name) 实现后发现,所有的日志记录器都存储在静态映射中。

我想知道如果应用程序中有数千个类并且每个类都定义了一个日志记录器,是否会引起内存/性能问题。

或者,为什么我们不能在应用程序中定义一些标准日志记录器(基于某些功能标准),然后让开发人员在类中使用它们。我理解单独定义一个记录器允许我们更改其日志级别,但是如果有足够预定义的日志记录器,则我认为这不是个大问题。

我查看了Is a logger per class or is a set of loggers that are accessed by the entire application preferred?Log4J: Strategies for creating Logger instances 这两个问题,但它们似乎没有涉及到此主题。

1个回答

4
您不一定必须这样做,但这样更容易管理。日志记录器遵循父子关系,子级几乎从父级继承一切。这样您就可以定义非常特定的日志记录行为或将其通用继承。
或者我们为应用程序定义一些标准日志记录器(基于某些功能标准),并要求开发人员在类中使用它们。我明白拥有单独的日志记录器允许我们更改其日志记录级别,但我认为如果有足够的预定义日志记录器,则这不是大问题。
这将需要进行相当强烈的依赖注入,以使那些日志记录器可用于每种类型,也可能增加额外的依赖项。

创建一个自定义日志记录器类,其中包含所有其他类别作为静态成员。 public class CustomLogger { public final static Logger customlog = LoggerFactory.getLogger("customlog"); } 然后我们调用CustomLogger.customlog.infor(""); - Naresh Vavilala
@NareshVavilala 你这么做有什么好处?现在你必须使用“CustomLogger.customlog.debug(..)”来记录你的信息。 - Sotirios Delimanolis
通过这种方式,我可以限制系统中使用的记录器数量,并减少由日志提供程序管理的映射中存储的条目数。 - Naresh Vavilala
@NareshVavilala,“Logger”实例都是由您的日志框架管理的。您仍然可以在某个未被称为“random”的类中执行LoggerFactory.getLogger(“random”);。在每个类中保留“private static”字段只是使其在内部使用更容易。 - Sotirios Delimanolis
我理解这一点。但如果我们使用除类名以外的名称,就无法跟踪记录器名称。将所有记录器声明在单独的类中使应用程序类与日志记录代码无关。一旦我们完成了这个设置,我们就可以像使用'System.out'和'System.err'一样使用自定义记录器。 - Naresh Vavilala
@NareshVavilala(您可以使用反引号\``来表示代码片段。)您应该拥有的唯一日志记录代码是debug(..)info(..)和其他类似的代码。而且,该代码应该非常依赖于使用它的类(反之亦然)。事实上,您不需要自定义类来获取对另一个记录器的引用。LoggerFactory.getLogger(..)`为您提供了访问库中管理的所有记录器的权限。您的配置是唯一的访问点。 - Sotirios Delimanolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接