一个类是否应该使用一个日志记录器,还是整个应用程序共用一组日志记录器更好?

17

我有一个Java项目,我创建了七个日志记录器,通过外观者从程序的每个点访问。但是在互联网上,我看到很多示例都是每个类中都有一个日志记录器。

什么是最推荐的记录日志的方法?

3个回答

14

在每个类中都有一个日志记录器会更好,更易于扩展。原因是在一个类中定义一个日志记录器可以很容易地将真正的日志API与记录器的配置(格式、持久性)分离开来。我已经使用过多个大型复杂的Java软件(> 100万行代码),它们都使用每个类一个日志记录器。

此外,“每个类一个日志记录器”的定义并不意味着每个类都使用不同的日志记录器实例。

class Foo {
    private static final Logger log = Logger.getLogger( Foo.class );
}


class Bar {
    private static final Logger log = Logger.getLogger( Bar.class );
}

以上代码中引用的两个日志记录器是否使用相同的日志记录器实例并不清楚。通常,在属性文件或代码中有一个配置位置来指定Foo和Bar中的日志记录器是否共享日志记录器实例。

因此,“每个类中的一个记录器”仅为每个类定义一个记录器,但是这种记录器可能引用在不同类中使用的相同记录器实例。


顺便说一下:我们也使用log4j。即使在Eclipse应用程序中,我们也使用每个类一个日志记录器来记录日志,并适配到Eclipse的构建日志机制(这是因为我们需要在Eclipse应用程序和独立应用程序中使用插件代码)。 - Ben Xu

11

我为每个类使用一个日志记录器来处理所有技术方面的问题,例如日志记录、跟踪、调试和方法输入/输出(private static final...)。通常我会为功能方面使用共享的日志记录器,例如审计日志、安全性,这些使用公共的日志记录器在共享类中。

我不知道是否有标准或一般最佳实践,但这种方法对我来说很有效。


1
我建议您使用一些日志框架,您可以找到很多,其中最流行的一个是log4j,这将节省您很多尝试重新发明轮子的麻烦,因为它们已经实现了大多数最佳实践。
如果您正在使用诸如Log4J之类的日志框架,一个常见的最佳实践是在每个类中获取静态变量的记录器。
class Foo {
    private static final Logger log = Logger.getLogger( Foo.class );
}

使用大多数日志框架,您可以定义日志级别(WARN、ERROR、DEBUG),还可以为附加器定义模式,因此您可以按不同的条件将消息存储在不同的文件中进行过滤。

此外,使用这些框架,您可以轻松设置诸如日志轮换之类的东西,这可能非常有用。


因为你只需要初始化一次。实例化更多没有意义,使用final可以确保你不会错误地这样做。 - jasalguero

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