BufferedWriter不考虑flush()也写入部分行



我将追加到一个简单的日志文件,其中每行都是一个条目。不幸的是,在关闭时,通常会出现部分写入的行。代码看起来像这样:

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,但没有。

如果你处理不当,SIGTERM将会停止你的程序,无论它在哪里。它可能在flush()的中间。考虑自己处理SIGTERM,当这种情况发生时,做一个干净的关闭。

但是,请注意,总是会出现局部行。在flush()期间,您的程序可能会被杀死,操作系统可能会崩溃或断电。你的程序应该(在开始时)能够处理不以换行符结束的日志。

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

最新更新