如何gzip由rotatelogs创build的日志

我正在使用rotatelogs来创build我的日常apache日志格式host.<day>.<month>.<year>.access.log 。 现在我想在完成后gzip和移动日志到不同的目录。 怎么做?

更新:有一个小错误。 logrotate – > rotatelogs

我已经想出了以下脚本

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

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

 compress 

到Apache的logrotateconfiguration。 还有一个简洁的选项,可以将压缩延迟一天:

 delaycompress 

至于移动他们,logrotate不能帮助你,但这样的cron工作可以:

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

我使用find和crontab来完成这个

# 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文件数据最近一次修改n * 24小时前。

! -name ! -name “不是”*“隐藏文件

! -name ! -name “而不是”.gz“文件,这些文件应该已经被压缩了

-print0 & -0确保空格或特殊字符正确传输到xargs – > gzip(用于文件名安全)

find-exec可以使用,但有缺陷在| xargs | xargs更稳定

您可以使用rotatelogs选项-p来使用程序在旋转后压缩日志。 (请参阅参考: https : //httpd.apache.org/docs/2.4/programs/rotatelogs.html )

-p程序

如果给定,每次打开新的日志文件时,rotatelogs将执行指定的程序。 新打开的文件的文件名作为第一个parameter passing给程序。 如果在执行循环后执行,则旧的日志文件将作为第二个parameter passing。 在继续操作之前,rotatelogs不会等待指定的程序终止,并且不会logging终止时返回的任何错误代码。 生成的程序使用与rotlog自身相同的stdin,stdout和stderr,并且还inheritance了环境。

例:

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