使用Java Logger的优势是什么?

3

我想将信息记录到文件中,想知道使用Java Logger类是否比我自己的日志记录方法更有优势?

我知道使用Logger只需将自己的FileHandler添加到Logger即可。我的个人方法只是使用FileOutputStream。

7个回答

9
老实说,您的记录器可能很好,很容易设置日志级别、过滤等功能。问题在于当您开始从10个不同组中组合代码时,每个组都有自己的记录方式。有些使用System.out,有些使用一些自定义的记录器,有些使用log4j等等。
如何解析或重定向输出?如何筛选所有输出以仅显示您的消息(例如,在log4j中进行筛选选项不能防止消息直接发送到System.out)。
这是一个相当大的批量更改,具体取决于您正在从哪个系统移动到哪个系统。最好从一开始就使用一个非常常见的记录器,并希望这是项目中每个人选择的记录器。

+1 我个人会投票给JUL。绝对要避免自己动手建立... - alpian
如果你够邪恶并且有点虐待狂,你可以替换PrintStream的System.out和System.err来过滤掉看起来像日志模式的东西...对我来说,JUL不够好,但它是一个很好的开始。 - Gressie
1
@Gressie 其实我曾经做过这件事,而且非常有趣。我甚至赋予它按模块进行过滤的能力,通过为每个打印行创建一个堆栈跟踪,查看从顶部向下几个级别的类,并基于此进行过滤。对于日志记录来说,速度非常慢(但老实说并不明显),当我们发布时,很容易完全禁用日志记录或将原始日志发送到文件而不是标准输出,因为所有内容都是集中管理的。 - Bill K

2
真正的问题是:在已经存在用于日志记录的库的情况下,为什么要费力地编写自己的日志记录器?你的记录器是否有其他库没有的功能?我有点怀疑。
标准化是另一个重大问题-请参见 Bill K 的回答。

2
你问题的答案是因为日志记录器可能会变得复杂 - 当它们变得复杂并且你不理解它们时,你可能会丢失消息。第一次花费整整一天的时间来尝试弄清楚为什么你的代码无法运行,并发现是因为你的日志记录器失败或配置错误,那么这将是你最后一次信任任何新的日志记录器。我经常只使用System.out,因为由于错误和配置错误,日志记录对我失败了不止一次 - 并且浪费了很多非常令人沮丧的时间。但总体而言,你的应用程序需要统一的日志记录,所以最终你必须让它工作。 - Bill K

1

对于大多数情况,标准的日志框架是最好的选择。它们非常灵活。但是使用自己的实现也可以是一个有效的选项,特别是如果我们不是在谈论传统的日志记录(全局调试、问题、警告消息),而是关于特定的信息消息或会计。

除其他因素外,请记住,日志记录的标准化允许第三方库进行合作。例如,如果您有一个使用(比如)Hibernate的标准Web应用程序,并且已配置了标准的Java日志记录库,则不仅可以从自己的代码中记录日志,还可以告诉Hibernate将调试信息记录到您的日志文件中(不一定是相同的文件)。这非常有用-几乎是必须的。

如果您使用纯FileOutputStream编写自己的日志记录库,则必须决定-除其他事项外-是否保持文件打开,还是在每次写入时重新打开-追加-关闭,并且您必须考虑同步和相关问题。虽然没有什么特别复杂的地方。


0

日志记录器提供了定义记录消息重要性级别和使用不同输出接收器(如控制台、文件等)的能力。

此外,当使用日志记录器时,轻松启用或禁用某些类型的消息 - 例如,在生产环境中您不想看到每个调试消息。


0
一个日志框架允许你指定日志级别(例如仅记录关键消息、仅记录调试消息等)。它还允许你将日志记录到多个目的地(例如文件、syslog等),即使在应用程序完全构建后,只需更改配置文件而不更改任何代码即可完成。它还可以根据各种参数轻松格式化日志。
由于适当的日志记录是一个相当复杂的问题,这些包已经被编写来解决它们,因此有许多其他优点。我认为重要的问题是,为什么你不会使用它们呢?

0

我总是更喜欢经过社区测试和批准的东西,而不是还需要大量测试的东西。日志记录器允许您执行许多操作,这将花费您一些时间来实现和测试解决方案的健壮性。一个重要的优点是下一个使用您代码的人的专业知识,如果它是您的日志记录器,通常需要更长时间学习它的工作原理,因为有更多的示例和文档可用于java.util.logger。


0

就像其他人提到的一样,使用更常见的日志系统比编写自己的日志系统有更多的优势。老实说,Java util logging api 的可配置性和扩展性远不如你在互联网上找到的其他库。

请记住,自己编写日志系统总是有缺点的,因为它经过的测试较少,因此更容易出现故障或跳过一些可能非常重要的消息。

个人而言,我更喜欢使用 SLF4J,因为它允许我插入适配器以支持更常用的日志框架,然后让我选择自己的实际日志实现,这解决了不同库作者偏爱不同日志框架的大部分问题。如果你认为自己有能力完成任务,你也可以为 SLF4J 编写一个实现 ;)


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