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 для файла журнала.

Другие вопросы по тегам