Alterando a maneira padrão do LogRotate de girar os arquivos de log

Alterando a maneira padrão do LogRotate de girar os arquivos de log

Minha observação sobre logrotation é que para girar qualquer arquivo de log, o processo logrotate, na seguinte ordem

  1. copia o arquivo de log em questão (vamos chamá-lo de arquivo1.log) com um novo nome (adicionando carimbo de data/hora ou um número ao nome existente para que ele se torne arquivo1.log-20140513),
  2. exclui o arquivo existente (arquivo1.log) e cria um novo arquivo de log em branco com o nome original (arquivo1.log),
  3. compacta o arquivo girado (file1.log-20140513), que cria um novo arquivo compactado (file1.log-20140513.gz), se a opção de compactação estiver definida,
  4. exclui o arquivo girado (file1.log-20140513) e, finalmente,
  5. vá para o próximo arquivo para fazer o mesmo acima de 4 etapas.

Estou tendo o seguinte problema neste processo:

  1. Meus arquivos de log são enormes (mais de 10 Gb cada) e tenho cerca de 42 desses arquivos de log.
  2. Os processos que gravam nesses arquivos funcionam em sincronia,
  3. O DiskIO no servidor é bom, mas ainda assim a cópia leva tempo, a compactação também leva tempo e a compactação também consome CPU.
  4. Quero que todos os arquivos de log recém-criados tenham logs começando no mesmo horário.

Para fazer isso, quero que o logrotate seja movido, algo que o comando mv faz, que renomeia os arquivos em vez de copiá-los. Quanto à compactação, posso desativá-la e acioná-la por meio de um script diferente agendado via cron. Mas quero que o logrotate mova os arquivos em vez de copiá-los.

Agora, tenho certeza de que isso é algo que os autores do logrotate também teriam pensado, pois obviamente economiza E/S do disco e o tempo necessário para concluir toda a operação do logrotate, então quero saber por que os arquivos estão sendo copiados em vez de serem movidos ou renomeados, e como eu consigo isso via logrotate.

NOTA: Tentei fazer isso manualmente, ou seja, mover o arquivo para o qual um processo em execução estava gravando também, e criar um novo arquivo em branco com o mesmo nome e as mesmas permissões (que é root, que também é a permissão que o processo é executando com), mas depois de mover e criar um novo arquivo, vi que o processo não estava gravando nada nele, então tive que reiniciar o processo para fazê-lo gravar naquele arquivo. Alguém pode explicar esse comportamento também por que o logrotate consegue fazer o processo gravar no mesmo arquivo, mas não consigo usar as etapas simples.

Responder1

O comportamento que você está descrevendo só acontece se o logrotate tiver sido explicitamente instruído a fazê-lo por meio da copytruncatediretiva. A documentação alerta sobre a possibilidade de perda de alguns dados de log devido a este comportamento. Essa directiva só deverá ser utilizada como último recurso.

O método padrão de rotação de arquivos de log é renomear e enviar um sinal ao processo para permitir que ele abra o novo arquivo de log. Isso é mais rápido e não corre o risco de perder parte do log. Mas requer que o processo de escrita seja capaz de mudar para um novo arquivo de log.

A compressão pode ser desligada ou adiada até a próxima rotação. Se a compressdiretiva for usada, os arquivos de log antigos serão compactados. Se essa diretiva não for usada, eles não serão compactados.

Se ambos compresse delaycompressforem usados, a compressão será adiada até a próxima rotação. Dessa forma, após cada rotação, os dois arquivos de log mais recentes ainda não terão sido compactados.

Responder2

depois de mover e criar um novo arquivo, vi que o processo não estava gravando nada nele, então tive que reiniciar o processo para fazê-lo gravar naquele arquivo

O processo está gravando no mesmo arquivo, é por isso que registra a cópia em vez de mover. Quando você exclui o log, o processo ainda grava no log e você pode ver o uso do sistema de arquivos aumentando, mas nenhum arquivo. A reinicialização do processo liberará espaço em disco.

considerar

informação relacionada