尽管有 flush(),BufferedWriter 仍写入部分行
BufferedWriter writes partial lines despite 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()
期间被杀死,操作系统可能会崩溃或可能会发生断电。您的程序应该(在开始时)能够处理不以换行符结尾的日志。
我对你提到的日志编写器的了解不够,不知道他们如何避免部分行,也许其他人可以提供比我更好的答案。
我正在附加一个简单的日志文件,其中每一行都是一个条目。不幸的是,关闭时通常会出现部分写入的行。代码如下所示:
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()
期间被杀死,操作系统可能会崩溃或可能会发生断电。您的程序应该(在开始时)能够处理不以换行符结尾的日志。
我对你提到的日志编写器的了解不够,不知道他们如何避免部分行,也许其他人可以提供比我更好的答案。