Назад | Перейти на главную страницу

Rotatelogs ротация файлов журнала в середине записи журнала

У меня есть инструмент С ++, который выводит в 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 для файла журнала.