Logrotate: Rotacionando arquivos não-log?

16

Eu tenho um script de backup que comprime vários arquivos e diretórios e cria arquivos .tgz. Os arquivos são nomeados, por exemplo,

...
backup_2010-10-28.tar.gz
backup_2010-10-29.tar.gz
backup_2010-10-30.tar.gz
backup_2010-10-31.tar.gz
backup_2010-11-01.tar.gz

Eu quero gerenciar esses arquivos para que apenas os últimos 5 backups sejam mantidos, com arquivos mais antigos sendo excluídos.

Posso usar o logrotate para fazer isso? Eles não são arquivos de log e já estão compactados. Eles estão em / root e não em / var / log - ainda posso usá-lo?

Obrigado

    
por jen 01.11.2010 / 10:58

5 respostas

3

Logrotate gira arquivos, então a resposta é sim - provavelmente, e se não houver permissões suficientes, coloque-os em / backup ou algo assim. Verifique qual grupo e usuário os logs rotacionados possuem: -).

Existem opções para compressão no logrotate, så se "compress" não estiver configurado - bem, então ele não tentará. Também no seu caso, a opção "girar 5".

Dê uma olhada em /etc/logrotate.d (ou onde quer que esteja armazenado em seu sistema)

    
por 01.11.2010 / 11:18
23

Sem uma alteração no seu processo, o logrotate por si só não fará o que você está procurando aqui. O principal problema aqui é que, embora o logrotate possa usar curingas, ele não tratará os arquivos como um se você fizer isso e, em vez disso, tentará rotacionar todos eles individualmente, o que definitivamente NÃO é o que você deseja.

Você pode, no entanto, fazê-lo funcionar da maneira que você descreve, desde que o backup mais recente seja criado sem um carimbo de data. Se o processo de backup criar /root/backup.tar.gz , por exemplo, você poderá usar a seguinte configuração de logrotate:

/root/backup.tar.gz {
    rotate 5
    nocompress
    dateext
    dateformat _%Y-%m-%d
    extension .tar.gz
    missingok
}

O rápido resumo das opções aqui:

  • rotate 5 - mantenha 5 rotações antes de excluir
  • nocompress - não comprima os arquivos depois de girar
  • dateext - use a data como extensão de rotação em vez de incrementar números
  • dateformat _%Y-%m-%d - defina o formato de extensão de data que você deseja usar
  • extension .tar.gz - torna o .tar.gz após a extensão de rotação
  • missingok - se o arquivo que queremos rotacionar não estiver lá, não se preocupe e continue (o padrão é gerar um erro)

Espero que isso ajude!

    
por 01.11.2010 / 12:32
18

Você não precisa usar o logrotate para fazer isso. Apenas use um comando como este:

ls -1 /root/backup_* | sort -r | tail -n +6 | xargs rm > /dev/null 2>&1

Este comando deixará os 5 arquivos mais recentes e removerá o restante (se houver). Você pode usá-lo em um cron job.

    
por 01.11.2010 / 11:24
0

Eu só tive a mesma situação. Logrotate soa muito legal, mas não funcionou para mim em 100% porque não combinava dados e nomes de arquivos.

Então, para evitar confusão, decidi incorporar a seguinte linha para executar depois de criar o meu backup atual para manter os últimos 5 backups.

Meus registros são, por exemplo:

  • tbl-bcx-20180308_010501.tar.bz2
  • tbl-bcx-20180307_010501.tar.bz2
  • tbl-bcx-20180306_010501.tar.bz2

Nova linha no meu script de backup (com base em um comentário acima)

  • encontre / BCX / dumpsql / -type f | sort -r | cauda -n +6 | xargs rm

Atenciosamente,

    
por 09.03.2018 / 00:15
-1

Você pode girar manualmente.

rotating_logger()
{

_LOG_FILE_=${1}
_MESSAGE_TO_ECHO_=${2}

_LOG_FILE_BYTES_SIZE_='wc -c ${_LOG_FILE_} | awk '{print $1}''

#echo "_LOG_FILE_BYTES_SIZE_ : ${_LOG_FILE_BYTES_SIZE_}"

# in MB
if [ ${_LOG_FILE_BYTES_SIZE_} -gt ${_FILE_SIZE_IN_BYTES_} ] ; then
        #cat /dev/null > ${_LOG_FILE_}
         for (( i=${_LOG_ROTATE_MAX_INDEX_}; i>=1; i-- ))
        do
                 if [ $i -eq ${_LOG_ROTATE_MAX_INDEX_} -a -f ${_LOG_FILE_}.$i ] ; then
                        rm -rf ${_LOG_FILE_}.$i
                 fi

                if [ $i -gt 10 ] ; then
                        rm -rf ${_LOG_FILE_}.10
                elif [ $i -eq 9 -a -f ${_LOG_FILE_}.9 ] ; then
                       mv ${_LOG_FILE_}.9 ${_LOG_FILE_}.10
                elif [ $i -eq 8 -a -f ${_LOG_FILE_}.8 ] ; then
                       mv ${_LOG_FILE_}.8 ${_LOG_FILE_}.9
                elif [ $i -eq 7 -a -f ${_LOG_FILE_}.7 ] ; then
                       mv ${_LOG_FILE_}.7 ${_LOG_FILE_}.8
                elif [ $i -eq 6 -a -f ${_LOG_FILE_}.6 ] ; then
                       mv ${_LOG_FILE_}.6 ${_LOG_FILE_}.7
                elif [ $i -eq 5 -a -f ${_LOG_FILE_}.5 ] ; then
                       mv ${_LOG_FILE_}.5 ${_LOG_FILE_}.6
                elif [ $i -eq 4 -a -f ${_LOG_FILE_}.4  ] ; then
                       mv ${_LOG_FILE_}.4 ${_LOG_FILE_}.5
                elif [ $i -eq 3 -a -f ${_LOG_FILE_}.3  ] ; then
                       mv ${_LOG_FILE_}.3 ${_LOG_FILE_}.4
                elif [ $i -eq 2 -a -f ${_LOG_FILE_}.2  ] ; then
                       mv ${_LOG_FILE_}.2 ${_LOG_FILE_}.3
                elif [ $i -eq 1 -a -f ${_LOG_FILE_}.1 ] ; then
                       mv ${_LOG_FILE_}.1 ${_LOG_FILE_}.2
                fi
        done
        mv ${_LOG_FILE_} ${_LOG_FILE_}.1
        touch ${_LOG_FILE_}
fi

echo 'date +%Y-%m-%d:%H:%M:%S' : "${_MESSAGE_TO_ECHO_}" >> ${_LOG_FILE_}
#echo "" >> ${_LOG_FILE_}
}

Agora, para colocar dados no log, faça

rotating_logger <file_path> "Welcome world!"
    
por 22.05.2017 / 02:27