Rotação de log orientada por espaço livre no linux?

8

Alguém acabou de me perguntar 'por quanto tempo devemos manter os logs do nosso aplicativo', e minha resposta foi 'até que o disco esteja cheio', pois não há motivo para jogá-los fora, a não ser ficar sem espaço.

No entanto, o logrotate padrão deseja que especifiquemos um período específico + número de rotações. Existe algo semelhante que digamos "gire diariamente e mantenha o histórico que quiser até que haja apenas 5% de espaço livre"?

A plataforma é o Redhat Linux.

kdt
fonte
1
Manter os registros até que o disco esteja cheio pode ser aplicado em ambientes físicos, mas como nos movemos principalmente para servidores virtuais e nuvem, o tamanho do sistema de arquivos deve ser o menor possível para reduzir custos. Nesse caso, você não pode evitar definir uma política de retenção.
Jfg956

Respostas:

9

Talvez você possa usar as diretivas firstaction ou lastaction para chamar um shell script que testa espaço livre em disco e, em seguida, execute uma exclusão nos arquivos mais antigos.

   firstaction/endscript
          The lines between firstaction and endscript (both of which must appear on lines by themselves) are
          executed (using /bin/sh) once before all log files that match the wildcarded pattern are  rotated,
          before  prerotate  script  is  run  and  only if at least one log will actually be rotated.  These
          directives may only appear inside a log file definition. Whole pattern is passed to the script  as
          first  argument.  If  the script exits with error, no further processing is done. See also lastac-
          tion.

Atualizar:

Aqui está uma postagem do Stackoverflow sobre o tipo de script que você pode executar:

/programming/7523059/remove-oldest-file-in-repository

cjc
fonte
1

o próprio logrotate não tem essa opção. Você pode adicionar um script cron que encontre o log mais antigo para remover sempre que o espaço livre ficar abaixo dos seus critérios. Você pode fazer alguma outra validação também. No entanto, ficar muito cheio o disco o tempo todo não é uma boa idéia, porque o sistema não poderá criar arquivos temporários grandes e poderá causar falhas no aplicativo.

johnshen64
fonte
Se você tem tudo em um sistema de arquivos, pode não ser uma boa ideia. No entanto, meus logs estão em seu próprio sistema de arquivos, para evitar atrapalhar qualquer outra coisa.
kdt
ah ok, se eles tiverem seu único fs, simplificará as coisas para ter um script para fazer a limpeza, dh / fs e usar awk ou cut para extrair% usado e, com base nessa figura, você poderá iniciar uma busca com exec rm. Geralmente não escrevo um script e apenas coloco uma linha no crontab.
johnshen64
0

Eu só queria salientar que há casos em que você não deseja que seus logs preencham todo o espaço em disco disponível. Eu lidei com vários hosts com diretórios thin / provision provisionados e manter os logs em um determinado tamanho foi crucial. Usamos um trabalho de comparsas em conjunto com o logrorate para manter o tamanho baixo. Algo semelhante pode ser usado em seu ambiente, embora um servidor de log central como splunk ou syslog-ng provavelmente seja uma opção melhor.

Tim Brigham
fonte
0

Como o @cjc sugeriu, você pode usar a primeira ação. Veja este exemplo:

/mnt/user/logs/*.log  /mnt/user/logs/*/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        su root www-data
        create 760 root www-data
        firstaction
          for file in `find  -type f -size +1024M`; do
              percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
              if [ $percent -gt 50 ]; then 
                  echo "Removed $file" >> /mnt/user/logs/logrotate.log
                  rm $file
              fi
           done;
        endscript
}

Neste exemplo, você removeu os arquivos maiores que 1 GB da partição / mnt / user se a partição usasse espaço superior a 50% .

esguti
fonte