Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java记录器的优势?_Java_Logging - Fatal编程技术网

使用Java记录器的优势?

使用Java记录器的优势?,java,logging,Java,Logging,我想将信息记录到一个文件中,并想知道使用Java Logger类与我自己的个人记录方法相比是否有任何优势 我知道使用记录器时,我只是将自己的文件处理程序添加到记录器中。我个人的方法就是使用FileOutputStream。记录器提供了定义所记录消息的不同重要性级别的能力,以及使用不同接收器进行输出的能力—控制台、文件等 此外,在使用记录器时,只启用或禁用某些类型的消息也很容易—例如,您不希望看到生产中的每一条调试消息。日志框架允许您指定日志级别(例如,仅记录关键消息、仅记录调试消息等)。它还允许

我想将信息记录到一个文件中,并想知道使用Java Logger类与我自己的个人记录方法相比是否有任何优势


我知道使用记录器时,我只是将自己的文件处理程序添加到记录器中。我个人的方法就是使用FileOutputStream。

记录器提供了定义所记录消息的不同重要性级别的能力,以及使用不同接收器进行输出的能力—控制台、文件等


此外,在使用记录器时,只启用或禁用某些类型的消息也很容易—例如,您不希望看到生产中的每一条调试消息。

日志框架允许您指定日志级别(例如,仅记录关键消息、仅记录调试消息等)。它还允许您登录到多个目标(例如,文件、系统日志等),即使在完全构建应用程序之后,您也可以这样做,只需更改配置文件,而不更改任何代码。它还可以根据各种参数轻松格式化日志


由于正确的日志记录是一个相当复杂的问题,因此还有许多其他优点,编写这些包就是为了解决这些问题。我认为重要的问题是,你为什么不使用它们?

老实说,你的日志记录器可能也很好,它很容易设置日志级别、过滤等

问题是,当您开始将来自10个不同组的代码放在一起时,每个组都有自己的日志记录。一些使用System.out,一些使用自定义记录器,一些使用log4j

如何解析或重定向输出?如何过滤所有输出以仅显示消息(例如,log4j中的过滤选项不会阻止消息直接发送到System.out)


这是一个很大的变化,取决于你从哪个系统移动到哪个系统。最好从一开始就使用一个非常常见的日志框架,并希望它是项目中其他所有人都选择的。对于大多数情况,标准日志框架是可行的。它们非常灵活。但是使用您自己的实现也是一个有效的选择,特别是当我们谈论的不是传统的日志记录(全局调试、问题、警告消息),而是特定的信息会议或记帐时

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


如果您使用纯FileOutputStream编写自己的日志库,则必须决定(除其他事项外)是保持文件打开,还是在每次写入时重新打开或关闭,并且必须考虑同步和相关问题。不过没什么特别复杂的

真正的问题是:既然已有用于编写日志的库,为什么还要编写自己的日志?您的日志记录器是否做了其他日志记录器不做的事情?我有点怀疑


标准化是另一个大问题——见Bill K的答案。

我总是更喜欢经过测试并得到社区认可的东西,而不是仍然需要大量测试的东西。Logger允许您执行许多事情,这些事情会占用您一些时间来实现和测试解决方案的健壮性。一个很大的好处是,下一个将对您的代码进行处理的人的专业知识,如果是您的日志记录者,通常需要更多的时间来了解其工作原理,因为java.util.logger的示例和文档要多得多。

就像所有其他人提到的一样,与编写自己的日志系统相比,使用更通用的日志系统有更多的优势。老实说,JavaUtil日志api不像您在internet上找到的其他库那样广泛和可配置

请记住,滚动自己的消息总是有一个缺点,即测试较少,因此更容易中断或跳过一些潜在的关键消息


就我个人而言,我更喜欢使用SLF4J,因为它允许我为更常用的日志框架插入适配器,然后让我选择自己的实际日志实现,这解决了不同库编写者偏好不同日志框架的大多数问题。如果你考虑自己的任务,你可以自己编写一个SLF4J的实现;p> +1我个人投票支持JUL。绝对避免建立自己的…如果你够邪恶并且有点受虐狂,你可以将打印流替换为System.out和System.err,以过滤掉看起来像日志模式的东西。。。对我来说,朱尔并没有放弃,但这是一个很好的开始。@Gressie实际上我做过一次——实际上很有趣。我甚至让它能够根据模块对其进行过滤,方法是为打印的每一行创建堆栈跟踪,从顶部往下看两级的类a,并基于此进行过滤——记录速度惊人地慢(但老实说,这并不明显)--当我们发布日志时,完全禁用日志记录或者将原始日志发送到文件而不是标准输出是很容易的,因为它是集中的。您的问题的答案是,日志记录者可能变得复杂,而当他们变得复杂而您不理解他们时,您可能会丢失消息。第一次花一整天的时间试图找出代码没有运行的原因,并发现这是因为您的记录器出现故障或配置错误,这是您最后一次信任任何新的记录器。我经常只使用System.out,因为由于错误和配置错误,日志记录多次失败,并且花费了很多令人沮丧的时间。但总的来说,你的应用程序需要统一的日志记录,所以最终你可以让它工作。