我有一个通过 printf 输出到 STDOUT 的 c++ 工具,即
printf ("%s\n", logline);
然后我将其通过管道传输到 rotatelogs 即
tool | rotatelogs /tmp/logs/log_%s 60
一切运行良好,但 rotatelogs 会在中间行旋转,因此日志文件 1 有这个 json 片段:
{"tim
...日志文件 2 将包含:
e":1386088072}
有没有办法让 rotatelogs 在换行时进行旋转?
答案1
简单答案:IO 缓冲。通过在命令前加上前缀来关闭它:
stdbuf -i0 -o0 -e0
例如:
stdbuf -i0 -o0 -e0 tool | rotatelogs /tmp/logs/log_%s 60
答案2
如果您拥有的工具是您自己的,或者您有它的源代码,请先修复它。我假设该工具是一个守护进程,因为它有要轮换的日志。(意味着它有长期的生命周期。)要成为守护进程,它必须复制 std* 并关闭与 tty 相关的原始文件。(这有点偏离主题。)
无论如何,如果您无法接触源代码,我建议使用“logrotate”而不是 apache“rotatelogs”。它是更通用、更完善的通用工具。
rotatelogs 的一个常见问题是,如果 rotatelogs 进程死亡,所有输出都会消失。因此请尝试:
$ tool > logfile &
并为日志文件创建或编辑logrotate.conf。