como implementar logrotate no shell script

12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Eu quero implementar o logrotate para controlar o tamanho do arquivo de log; então, como implementar o logrotate, se a situação for como acima?

Veerendra
fonte

Respostas:

11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

Eu removi o "&", pois isso pode causar um problema.

curioso
fonte
@Veerendra precisamos colocar a lógica de rolar os registros dentro do loop como você está executando um loop infinito ..
curiosa
@ Veerendra no meu post anterior tivemos um erro .. "mv" não criará um novo arquivo, mas você poderá alterar o script de acordo com sua necessidade.
curioso
Então, em vez de cpe mvposso remover o arquivo de log, ele criará um novo arquivo de log com o mesmo nome? (Meu requisito é que, se o arquivo de log atingir um determinado limite, desejo remover esse arquivo de log e criar um novo arquivo )
Veerendra
Você deve usar >>para anexar ao arquivo de log, >sobrescrevendo-o repetidamente.
alcik 23/09/15
se eu estiver usando >, estou recebendo tail: test.log: file truncated Hello World!.... Se eu estiver usando >>, estou recebendo uma mensagem de log correta, mas o tamanho do arquivo está aumentando. Nenhuma condição verificando a condição ... ;-(
Veerendra
24

que tal usar savelog?

Está disponível no debian e RH e praticamente todas as outras distribuições Linux que eu conheço. É um script de shell / bin / sh, portanto deve ser executado em qualquer outro unix também.

por exemplo, antes de escrever qualquer coisa para test.logexecutar savelog -n -c 7 test.log. Isso manterá as 7 versões não vazias mais recentes do test.log. Por padrão, ele comprime os logs rotacionados (mas que podem ser desativados -l).

Se necessário, você pode verificar o tamanho test.loge somente savelogse estiver acima de um determinado tamanho.

cas
fonte
Alguma idéia de qual pacote contém isso no AWS Linux (perto do CentOS, acredito)? A instalação padrão não possui savelog. Eu não posso encontrá-lo a partir yum ou usando repos padrão
jhonkola
savelog não encontrado no RHEL 5. Você sabe em qual repositório deve estar?
Felipe Alvarez
nenhuma idéia sobre o empacotamento centos ou rhel5, mas você pode encontrar o /usr/bin/savelogshell script em sources.debian.net/src/debianutils/4.7
cas
2
Não encontrei savelogem nenhuma das minhas caixas RHEL / CentOS 5/6, então acabei de fazer o download ad hoc e parece funcionar muito bem para minhas necessidades.
Dale Anderson
Uma desvantagem savelogé que ele renomeia o arquivo, mas leva muito tempo para compactar os antigos antes de terminar. Enquanto isso, o log .0 já recebe entradas nos próximos dias. Idealmente, o tempo entre a rotação do log e a sinalização do processo para reabri-lo deve ser mínimo. Desativei savelogo recurso de compactação por causa disso.
Rustyx # 13/18
2

Eu escrevi um logrotee neste fim de semana. Provavelmente não saberia se tivesse lido a ótima resposta domultilog @ JdeBP .

Eu me concentrei em ser leve e poder bzip2 seus pedaços de saída como:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Ainda há muito a ser feito e testado.

Victor Sergienko
fonte
0

Como ainda não consigo adicionar comentários à resposta aceita , uma dica do BusyBox , onde dunão tem um -bsinalizador:

du /var/log/file | tr -s '\t' ' ' | cut -d' ' -f1
lnksz
fonte