[apache][logrotate] ログ圧縮方法


某所にてApacheをインストールした際、最新のバージョンが使いたいという要件からrpmからではなくソースからインストールしました。ある程度の規模のアクセスを見込んでいたので、rotatelogsを使って、apacheのプロセスを再起動することなくログのローテーションをすることにしたのですが・・・

(;´Д`) 1日のアクセスログが5GBって何?

予想以上のアクセス数で、/usrパーティションが1週間もしないうちに枯渇してしまうであろうことは容易に想像できたので、とりあえずはlatestなログ以外は全部gzip圧縮してしまおう!と思ったのです。

 ・ 仕様
apacheのアクセスログとエラーログのうち、昨日データが修正されたもので、かつまだ圧縮されていないものを検索し、gzip圧縮する

# cd /root/bin
# touch logcompress.sh
# chmod 755 logcompress.sh
# vi logcompress.sh
~~~~~~~~ ここから記述 ~~~~~~~~
#!/bin/sh
LANG=C
cd /usr/local/apache2/logs
for i in `find . -name '*_log*' -mtime 1 | grep -iv gz`
do
    gzip $i
done
~~~~~~~~ ここまでです ~~~~~~~~

ちなみに、rotatelogsってなんで朝9時に実行されるんだろ?って思ってヘルプを見てみたら

$ /usr/local/apache2/bin/rotatelogs --help
Incorrect number of arguments
Usage: /usr/local/apache2/bin/rotatelogs [-l] [-f] {|} [offset minutes from UTC]

Add this:

TransferLog "|/usr/local/apache2/bin/rotatelogs /some/where 86400"

or

TransferLog "|/usr/local/apache2/bin/rotatelogs /some/where 5M"

to httpd.conf. The generated name will be /some/where.nnnn where nnnn is the
system time at which the log nominally starts (N.B. if using a rotation time,
the time will always be a multiple of the rotation time, so you can synchronize
cron scripts with it). At the end of each rotation time or when the file size
is reached a new log is started.

当たり前ですがUTCで0時に実行されるんですね(^_^;

なので、さっき作ったlogcompress.shは、毎日9時より数分後にcronで実行するようにしています。これによって、生ログで5GB近くあったものが300MB程度に圧縮されました。わーい。