Resposta simples: buffer de IO. Desativar prefixando seu comando com:
stdbuf -i0 -o0 -e0
por exemplo:
stdbuf -i0 -o0 -e0 tool | rotatelogs /tmp/logs/log_%s 60
Eu tenho uma ferramenta c ++ que é enviada para STDOUT via printf, por exemplo
printf ("%s\n", logline);
Eu então canalizo isso para rotatelogs, ou seja,
tool | rotatelogs /tmp/logs/log_%s 60
Tudo funciona muito bem, mas os rotatelogs girarão a linha média para que o arquivo de log 1 tenha este snippet json:
{"tim
... e o arquivo de log 2 terá:
e":1386088072}
Existe uma maneira de incentivar rotatelogs a girar em quebras de linha?
Resposta simples: buffer de IO. Desativar prefixando seu comando com:
stdbuf -i0 -o0 -e0
por exemplo:
stdbuf -i0 -o0 -e0 tool | rotatelogs /tmp/logs/log_%s 60
Se a ferramenta que você possui for sua ou se você tiver uma fonte dela, corrija-a primeiro. Eu assumi que a ferramenta é um daemon, pois tem log para girar. (significa que tem ciclo de vida a longo prazo). para ser um deamon, ele deve duplicar std * e fechar originais relacionados a tty. (é um pouco fora do tópico.)
De qualquer forma, se você não pode tocar na fonte, eu recomendo usar 'logrotate' em vez de apache 'rotatelogs'. é mais geral e bem feita ferramenta para fins genéricos.
um dos problemas comuns dos rotatelogs é que, se o processo de rotatelogs estiver morto, todas as saídas são eliminadas. então tente:
$ tool > logfile &
e crie ou edite logrotate.conf para logfile.