Como gzip logs criados por rotatelogs

6

Estou usando rotatelogs para criar meus logs diários do apache no formato host.<day>.<month>.<year>.access.log . Agora eu quero gzip e mover o log para o diretório diferente depois de ter terminado. Como fazer isso?

Atualização: Houve um pequeno erro. logrotate - > rotatelogs

    
por Poma 23.12.2011 / 15:49

5 respostas

5

Eu criei o seguinte script

#!/bin/sh
for file in $(ls /var/log/apache2/*.$(date +"%y.%m.%d" --date="1 day ago").access.log); do
    gzip $file
    mv $file.gz /var/log/apache2/archive
done;

E seguindo a entrada do cron

15 0    0 0 0   root    /mypath/myscript.sh
    
por 23.12.2011 / 17:19
3

Você pode usar a opção rotatelogs -p para usar um programa para compactar o log após a rotação. (Consulte para referência: link )

-p program

If given, rotatelogs will execute the specified program every time a new log file is opened. The filename of the newly opened file is passed as the first argument to the program. If executing after a rotation, the old log file is passed as the second argument. rotatelogs does not wait for the specified program to terminate before continuing to operate, and will not log any error code returned on termination. The spawned program uses the same stdin, stdout, and stderr as rotatelogs itself, and also inherits the environment.

Exemplo:

CustomLog "|bin/rotatelogs -p '/path/to/compress.sh' -l /var/log/logfile.%Y.%m.%d 86400"

compress.sh :

#!/bin/bash
file_to_compress="${2}"
compress_exit_code=0

if [[ "${file_to_compress}" ]]; then
    echo "Compressing ${file_to_compress} ..."
    tar --gzip --create --file "${file_to_compress}.tar.gz" "${file_to_compress}"

    compress_exit_code=${?}

    if [[ ${compress_exit_code} == 0 ]]; then
        echo "File ${file_to_compress} was compressed."
    else
        echo "Error compressing file ${file_to_compress} (tar exit code: ${compress_exit_code})."
    fi
fi

exit ${compress_exit_code}
    
por 06.10.2017 / 01:15
1

Logrotate ficará feliz em fazer a compactação para você. Apenas adicione:

compress

Para a configuração logrotate para o apache. Há também uma opção interessante que atrasa a compactação em um dia:

delaycompress

Quanto a movê-los, o logrotate não pode ajudá-lo, mas um cron job como esse pode:

@daily mv /var/log/apache/*.gz /var/log/archive/
    
por 23.12.2011 / 18:43
1

Eu uso find e crontab para realizar isso

# crontab -e

5 0 * * * /bin/find /path/to/logs/* -type f \( -mtime 1 ! -name "." ! -name ".gz" \) -print0 | xargs -0 gzip >/dev/null 2>&1;

-mtime n Os dados do arquivo foram modificados pela última vez n * 24 horas atrás.

! -name "not". * "arquivos ocultos

! -name "não" .gz "arquivos que já devem ser compactados

-print0 & -0 para garantir que espaços ou caracteres especiais sejam canalizados corretamente para xargs - > gzip (para segurança do nome do arquivo)

find -exec poderia ser usado mas tem falhas onde | xargs é mais estável

    
por 13.05.2015 / 19:11
1
CustomLog "|/opt/IHS/bin/rotatelogs -l /some/path/access_log.%Y.%m.%d 86400" common | gzip -9 /some/path/access_log.'date '+%Y.%m.%d''
    
por 04.10.2017 / 10:34