Rotação de log: girando arquivos que não são de log?

17

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

Quero gerenciar esses arquivos para que apenas os últimos 5 backups sejam mantidos, com os 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

jen
fonte

Respostas:

3

O logrotate gira os 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 alternados têm :-).

Existem opções para compactação no logrotate, mesmo se "compress" NÃO estiver configurado - bem, ele não tentará. Também no seu caso, "gire 5" opção.

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

3molo
fonte
26

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 receber caracteres curinga, ele não tratará os arquivos como um só se você fizer isso e tentará girar todos eles individualmente, o que definitivamente NÃO é o que você deseja.

No entanto, você pode 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.gzpor exemplo, você poderá usar a seguinte configuração de rotação de log:

/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 aumentar números
  • dateformat _%Y-%m-%d - defina o formato de extensão de data que você deseja usar
  • extension .tar.gz- faça o que .tar.gzvem depois da extensão de rotação
  • missingok - se o arquivo que queremos girar não estiver lá, não se preocupe e siga em frente (o padrão é gerar um erro)

Espero que isto ajude!

marca
fonte
1
Bom trabalho. Aprendi algumas coisas lendo isso. Quero acrescentar, no entanto, que algumas distribuições, principalmente RedHat EL, tendem a retirar opções que não são "Enterprise Ready", então YMMV.
Zerolagtime 1/11/10
De acordo com esta solução, o stackoverflow.com/questions/14858752/… logrotate poderia realizar a tarefa.
Pieter
22

Você não precisa usar o logrotate para fazer isso. Basta usar 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á os restantes (se houver). Você pode usá-lo em um trabalho cron.

Khaled
fonte
mas isso não gira ....
simpleuser
Não responde a pergunta.
Kubanczyk # 22/17
4
A questão era manter os cinco backups mais recentes e isso faz exatamente isso. Ainda mais simples: ls -t1 / root / backup_ * | cauda -n +6 | xargs rm -f
yoyoma2
Isso respondeu à minha pergunta. Infelizmente, a pergunta original foi a mais próxima que pude encontrar com o Google-fu.
Sukima 20/06
0

Eu apenas tive a mesma situação. O logrotate parece muito legal, mas não funcionou 100% para mim porque não corresponde aos dados e aos nomes de arquivos.

Portanto, para evitar confusão, decidi incorporar a seguinte linha para executar após criar meu backup atual para manter os últimos 5 backups.

Meus logs são:

  • 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 | classificar -r | cauda -n +6 | xargs rm

Saudações,

200313
fonte
-1

Você pode girá-lo 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, basta fazer

rotating_logger <file_path> "Welcome world!"
Krrish Krrish
fonte
1
Talvez você possa se esforçar um pouco para formatar sua postagem, se quiser que seja útil.
Tim