我应该为每一行日志使用 try-with-resources 语句吗?

Posted

技术标签:

【中文标题】我应该为每一行日志使用 try-with-resources 语句吗?【英文标题】:Should I use a try-with-resources statement for each line of log? 【发布时间】:2015-05-12 14:49:33 【问题描述】:

我想在每次发生某些事情时记录(附加文本)到文件中。我发现这可能是使用 Java 7 的 try-with-resources 语句执行此操作的正确方法:

public void log(String textLine) 
    try(PrintWriter output = new PrintWriter(new BufferedWriter(new FileWriter("Logfile.txt", true)))) 
        output.println(textLine);
    catch (IOException e) 
        //exception handling
    

我担心的是这个日志方法被频繁调用,并且每次调用这个方法时都会关闭并重新打开输出,这是不必要的。同时,我想从 Java 7 的 try-with-resources 语句功能中受益。

我的担心不是因为重新打开和关闭 writer 的操作成本不高吗?或者我应该使用 Java 6 的老式方式,即手动处理异常并将输出声明为成员字段并在应用程序结束时手动关闭输出?

【问题讨论】:

您是否考虑过使用标准日志库,这样您就不必担心所有这些问题?这也将为您提供更多灵活性,例如日志级别,并且日志审核软件将能够更轻松地解析它 【参考方案1】:

不,您应该在每次要在日志文件中添加新行时打开和关闭 FileWriter

你应该:

在应用程序启动时打开日志文件 附加到它 致电flush() 最后拨打close()

或者如果你想使用 try-with-resources 语句,那么调用记录器方法的代码应该放在 try-with-resources 语句的主体中。多亏了这一点,您不必调用 close() 方法,因为它会被自动调用。

但最好的解决方案是,使用现有的、经过实战考验的开源记录器之一,例如 log4j 或 logback,而不是重新安装***,它涵盖了所有这些内部细节和公开一个简单的 API,让您可以简单地记录提供的消息。

【讨论】:

with "try-with-resource" close() 被自动调用:docs.oracle.com/javase/tutorial/essential/exceptions/… @SashaSalauyou “你做的从根本上是错误的,这是一个更好的方法”是一个完全合理的答案。 @Adam 非常感谢 Adam,他不仅为记录器库(log4j、日志)提供建议,而且还提供了手动操作的正确方法。

以上是关于我应该为每一行日志使用 try-with-resources 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

insertRowsAtIndexPaths 为每一行调用 cellForRowAtIndexPath

MYSQL 为每一行从另一个表连接随机行

德尔福Firedac大师详解多项

MySQL为每一行自动存储日期时间

ag-Grid - 是不是可以为每一行创建一个浮动菜单?

遍历文本文件并为每一行分配变量