У меня есть инструмент С ++, который выводит в STDOUT через printf, т.е.
printf ("%s\n", logline);
Затем я передаю это в ротацию журналов, т.е.
tool | rotatelogs /tmp/logs/log_%s 60
Все работает отлично, но rotatelogs будет вращать среднюю строку, поэтому файл журнала 1 имеет этот фрагмент json:
{"tim
... и файл журнала 2 будет иметь:
e":1386088072}
Есть ли способ стимулировать ротацию журналов ротации при переносе строки?
Простой ответ: буферизация ввода-вывода. Выключите его, добавив к вашей команде префикс:
stdbuf -i0 -o0 -e0
например:
stdbuf -i0 -o0 -e0 tool | rotatelogs /tmp/logs/log_%s 60
Если у вас есть собственный инструмент или у вас есть его источник, сначала исправьте его. Я предположил, что это демон, поскольку у него есть журнал для ротации. (означает, что у него долгий жизненный цикл.) Чтобы быть демоном, он должен дублировать std * и закрывать оригиналы, относящиеся к tty. (это несколько не по теме.)
В любом случае, если вы не можете прикоснуться к источнику, я рекомендую использовать 'logrotate' вместо apache 'rotatelogs'. это более общий и хорошо сделанный инструмент для общих целей.
Одна из распространенных проблем ротационных журналов заключается в том, что если процесс ротационных журналов не работает, все выходы пропадают. поэтому постарайтесь:
$ tool > logfile &
и создайте или отредактируйте logrotate.conf для файла журнала.