【问题标题】:Why do we need to create loggers per class?为什么我们需要为每个类创建记录器?
【发布时间】:2014-09-12 21:01:54
【问题描述】:

许多论坛和 stackoverflow 问题都建议创建记录器的推荐方法是为每个类创建它们。

快速浏览一下 Log4j 的 Logger getLogger(String name) 实现表明,所有记录器都存储在静态映射中。

我想知道如果我们在一个应用程序中有数千个类,并且在每个类中定义了一个记录器,它会不会导致内存/性能问题。

另外,为什么我们不能在应用程序中定义一些标准记录器(基于一些功能标准)并让开发人员在类中使用它们。我知道拥有一个单独的记录器可以让我们更改其记录级别,但我相信如果有足够的预定义记录器,这不是什么大问题。

我看了Is a logger per class or is a set of loggers that are accessed by the entire application perferred?Log4J: Strategies for creating Logger instances的问题 但他们似乎没有涵盖这个话题。

【问题讨论】:

    标签: java logging log4j slf4j


    【解决方案1】:

    您不必这样做,只是更容易管理。记录器遵循父子关系。孩子几乎继承了父母的一切。通过这种方式,您可以定义非常具体的日志记录行为或对其进行一般继承。

    另外,为什么我们不能定义一些标准的记录器(基于一些 功能标准)在应用程序中,并让开发人员使用 他们在课堂上。我知道拥有一个单独的记录器允许 我们改变它的日志记录级别,但我相信这不是大问题 有足够的预定义记录器。

    这将需要一些非常强烈的依赖注入来使这些记录器可用于每种类型,还可能会添加额外的依赖。

    【讨论】:

    • 如何创建一个包含所有其他类别作为静态成员的自定义记录器类。公共类 CustomLogger { public final static Logger customlog = LoggerFactory.getLogger("customlog"); } 我们调用 CustomLogger.customlog.infor("");
    • @NareshVavilala 你这样做有什么收获?您现在必须执行 CustomLogger.customlog.debug(..) 来记录您的消息。
    • 有了这个,我可以限制系统中使用的记录器的数量,并减少存储在记录提供者管理的地图中的条目数
    • @NareshVavilala Logger 实例全部由您的日志框架管理。你仍然可以在一些不叫random的类中做LoggerFactory.getLogger("random");。通过在每个类中保留private static 字段,只会让内部使用更容易。
    • 我明白这一点。但是,如果我们使用类名以外的名称,则无法跟踪记录器名称。将所有记录器声明在一个单独的类中使应用程序类独立于记录代码。一旦我们有了这个设置,我们就可以使用自定义记录器,就像'System.out'和'System.err'
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多