Arquivos de log rotativos Rsync

1

Atualmente tenho um problema problemático. Eu precisava de um bom tempo para identificar esse problema. De qualquer forma, é o que estou fazendo:

Eu coleciono arquivos de log com rsync de vários servidores para arquivá-los. É importante preservar os atributos de tempo, portanto, estou usando o modo de arquivamento de rsync . Mas, em alguns casos, isso leva a alguns erros.

O problema é que os arquivos de log estão girando (mudando) nos servidores.

Portanto, os logs atuais que estão em uso são nomeados como test.log (eles não estão recebendo rsync ed). Após algum tempo e / ou um tamanho de arquivo específico, o arquivo de log está girando. Significado test.log é renomeado para test.log.1 . Agora, quando test.log for girado novamente, test.log.1 será renomeado para test.log.2 e test.log será renomeado para test.log.1 .

Acho que quando test.log iria diretamente para test.log.2 , não haveria problema. Mas isso é algo que não posso mudar.

E exatamente essa rotação acontece de alguma forma (às vezes) exatamente quando eu estou rsync ing. Então rsync obtém todos os atributos de tempo dos arquivos, então a rotação acontece e então rsync começa a coletar os arquivos de log. Mas agora, por exemplo, test.log.1 não é mais o mesmo arquivo. Mas rsync fica assim mesmo. No final rsync não pode excluir o arquivo no servidor porque ele mudou (vejo isso no rsync debug). Espero que essa explicação faça sentido.

Então, talvez um pequeno fluxo de processo:

  1. rsync obtendo uma lista de arquivos com atributos de tempo ( test.log.1 e test.log.2 ) (isso é o que acredito que está acontecendo, não sei exatamente como o 'rsync' funciona)
  2. os registros estão girando ( test.log.1 agora é denominado test.log.2 e .2 now .3 )
  3. rsync começa a coletar ( test.log.1 e test.log.2 )
  4. rsync não pode excluir o arquivo específico

Então, há alguma opção que impeça isso?

    
por M.S. 26.05.2016 / 14:22

2 respostas

1

Esse problema é melhor resolvido no estágio de rotação, não no estágio de cópia e arquivamento. Se você alterar a rotação de log para datar os arquivos em vez de fornecer números sequenciais, o arquivamento do rsync não precisará de nenhuma lógica para fazer o Right Thing ™.

Supondo que você já esteja usando o logrotate para rotação, isso pode ser feito com a opção dateext . Mas se o aplicativo estiver gerenciando sua própria rotação, pode ser mais difícil de configurar. Eu sei que o log4j também pode anexar datas aos arquivos girados, mas isso pode não ser exposto através da configuração e, portanto, pode exigir uma alteração no aplicativo. Você também pode desativar a rotação no nível do aplicativo e usar o logrotate.

    
por 26.05.2016 / 19:20
0

No final de uma transferência, rsync verifica se o arquivo transferido corresponde ao que foi transferido. Se os arquivos não corresponderem, você avisa e passa para o próximo. Se você tiver --remove-source-files , não removerá um arquivo que acredita ter sido transferido incorreta ou incompletamente.

Desde que exista uma janela de oportunidade durante a qual rsync possa transferir com sucesso os arquivos de log, não há grande problema em repetir o rsync com mais frequência - ou até mesmo repeti-lo até conseguir:

k=3
while test 0 -lt $k && k=$((k-1))
do
    rsync .... && break
    sleep 10
done

Se isso não funcionar para você, será necessário pensar em como você pode "capturar instantaneamente" os arquivos de log por tempo suficiente para copiar:

ssh -q remote_host 'mkdir -p rsync.tmp; cp -p *.log rsync.tmp/'
rsync -a --remove-source-files remote_host:/path/to/logs/rsync.tmp/*.log ....
    
por 26.05.2016 / 17:11

Tags