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