尽管flush()

时间:2015-07-24 08:28:33

标签: java java-io

我附加到一个简单的日志文件,其中每一行都是一个条目。不幸的是,在关闭时,通常存在部分写入的行。代码如下所示:

private val out = java.nio.file.Files.newBufferedWriter(
  java.nio.file.Paths.get(file),
  java.nio.charset.StandardCharsets.UTF_8,
  java.nio.file.StandardOpenOption.APPEND,
  java.nio.file.StandardOpenOption.CREATE)

def write(s: String) = synchronized {
  out.write(s)
  out.newLine()
  out.flush()
}

(对Scala感到抱歉。)

我不明白为什么部分行会出现在文件中。我认为默认的缓冲区大小是8 kB。条目较短(<500字节)。每次写完后我都会冲洗。

我无法重现部分线条 - 问题发生在客户端。但我几乎可以肯定他们只是将SIGTERM发送到进程来关闭它。

SLF4J / LogBack / Log4j写的日志文件从不具有部分行。我究竟做错了什么?我查看了Apache Commons IO,希望找到一个有保证的基于行的Writer,但没有。

1 个答案:

答案 0 :(得分:1)

如果你没有正确处理它,SIGTERM将停止你的程序,无论它在哪里。它可能位于flush()内。考虑自己处理SIGTERM,并在发生这种情况时进行干净关闭。

但请注意,部分线条总是会出现。您的程序可能会在flush()期间被终止,操作系统可能会崩溃或可能会发生断电。您的程序应该(在开始时)能够处理不以换行符结尾的日记。

我对你提到的日志编写者没有足够的了解,知道如何避免部分行,也许其他人可以提供比我更好的答案。