如何对 rotatelogs 创建的日志进行 gzip 压缩

如何对 rotatelogs 创建的日志进行 gzip 压缩

我正在使用 rotatelogs 以格式创建我的每日 apache 日志host.<day>.<month>.<year>.access.log。现在我想在完成后对日志进行 gzip 压缩并将日志移动到不同的目录。该怎么做?

更新:出了一点小错误。- logrotate>rotatelogs

答案1

你可以使用旋转日志选项-p使用程序对轮转后的日志进行压缩。(参见:https://httpd.apache.org/docs/2.4/programs/rotatelogs.html

-p 程序

如果指定,rotatelogs 将在每次打开新日志文件时执行指定的程序。新打开的文件的文件名作为第一个参数传递给程序。如果在旋转后执行,旧日志文件将作为第二个参数传递。rotatelogs 不会等待指定程序终止后再继续操作,也不会记录终止时返回的任何错误代码。生成的程序使用与 rotatelogs 本身相同的 stdin、stdout 和 stderr,并且还继承环境。

例子:

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

压缩文件

#!/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}

答案2

我想出了以下脚本

#!/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;

并遵循 cron 条目

15 0    0 0 0   root    /mypath/myscript.sh

答案3

Logrotate 很乐意为您进行压缩。只需添加:

compress

转到 apache 的 logrotate 配置。还有一个巧妙的选项,可以将压缩延迟一天:

delaycompress

至于移动它们,logrotate 无法帮助您,但像这样的 cron 作业可以:

@daily mv /var/log/apache/*.gz /var/log/archive/

答案4

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'`

相关内容