MacOSX(Tiger)でapacheのログをlogrotateする

ほんま、いつまでサーバの設定やってねん!って感じです。

インフラ担当の必要性を強く感じつつも、僕が目指すのはWebからデバイスまで
全部一人でつくれてしまう人間なのでコードも打てずに四苦八苦しているこの時間も
俺を強くするんだ!と思いながらいろいろやってます。

前置きはこれくらいにして、MacOSXでlogrotateする方法です。logのrotateの方法はいくつかりますが、そのあたりの説明は他サイトに譲るとしてとっとと備忘ログ。

まずmacportsで入れられるかチェック。

# port list | grep log
CocoaDialog                    @2.1.1          aqua/CocoaDialog
clog                           @20030825       devel/clog
dialog                         @1.1-20070704   devel/dialog
eventlog                       @0.2.5          devel/eventlog
log4cpp                        @0.3.5rc3       devel/log4cpp
rlog                           @1.3.7          devel/rlog
geneweb                        @4.10           genealogy/geneweb
lifelines                      @3.0.46.1       genealogy/lifelines
commons-logging                @1.1            java/commons-logging
jakarta-log4j                  @1.2.14         java/jakarta-log4j
gprolog                        @1.3.0          lang/gprolog
logtalk                        @2.30.3         lang/logtalk
prolog-mode.el                 @1.2            lang/prolog-mode.el
swi-prolog                     @5.6.39         lang/swi-prolog
swi-prolog-devel               @5.5.36         lang/swi-prolog-devel
swi-prolog-lite                @5.6.12         lang/swi-prolog-lite
ucblogo                        @5.5            lang/ucblogo
pflogsumm                      @1.1.0          mail/pflogsumm
logjam                         @4.2.4          net/logjam
uplog                          @0.2            net/uplog
p5-catalyst-log-log4perl       @1.00           perl/p5-catalyst-log-log4perl
p5-log-dispatch                @2.12           perl/p5-log-dispatch
p5-log-log4perl                @1.12           perl/p5-log-log4perl
p5-sys-syslog                  @0.18           perl/p5-sys-syslog
p5-unix-syslog                 @0.100          perl/p5-unix-syslog
py-log4py                      @1.3            python/py-log4py
py-logilab-common              @0.15.0         python/py-logilab-common
rb-devel-logger                @1.2.2          ruby/rb-devel-logger
rb-log4r                       @1.0.5          ruby/rb-log4r
iverilog                       @0.8.2          science/iverilog
logsentry                      @1.1.1          security/logsentry
logsurfer                      @1.6b           security/logsurfer
cronolog                       @1.6.2          sysutils/cronolog
cronolog-devel                 @1.7.0-beta     sysutils/cronolog-devel
logrotate                      @3.7.1          sysutils/logrotate
syslog-ng                      @2.0.5          sysutils/syslog-ng
mkcatalog                      @1.1            textproc/mkcatalog
analog                         @6.0            www/analog
xdialog                        @2.1.2          x11/xdialog
zope-ploneloginhistory         @0.2.0          zope/zope-ploneloginhistory

いっぱいある。。。ogrotateも発見。

logrotateとanalogを入れることにします。

# sudo port install logrotate
# sudo port install analog

logrotate用の設定ファイルを/opt/local/etc/logrotate.d以下におくことにします。

# sudo mkdir -p /opt/local/etc/logrotate.d
# sudo vi /opt/local/etc/logrotate.d/apache.conf
/opt/local/apache2/logs/*.makotokw.com-*log {
daily
rotate 4
size 0
create
noolddir
ifempty
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /opt/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
#    EXT=`date +%Y%m%d`
EXT=`/opt/local/bin/php /opt/local/etc/logrotate.d/yesterday`
for f in $1;
do mv $f.1 $f.$EXT;
done
endscript
}

※ちなみにrotateで世代数を指定しても、拡張子を日付に変えてrenameしているためファイルを見つけられず古い世代の削除はできないらしいです。

さて拡張子を日付にするところで/opt/local/etc/logrotate.d/yesterdayというスクリプトを利用しています。

MacOSXのdateコマンドのパラメータで使えそうなのが全然なくて昨日の日付を表示することができなさそうだったので
phpで

#!/opt/local/bin/php
<?
$d = date("Ymd",time()-24*3600);
print $d;
?>

という内容で作成しています。

#cd /opt/local/etc/logrotate.d
# sudo vi yesterday.php
# sudo chmod 0755 yesterday

さて、何で昨日の日付を取得するか??
dailyでログを書き換える場合Web上で見かけるほとんどのlogrotateの設定方法ではcronで24:00(00:00)にlogrotateを走らせlogを待避(rotate)させているのですが、logrotateの設定をみてわかる通り、logのrotate後にapacheにlogファイルを新しく作成させるためにapacheを再起動させてます。

サービスにもよりますが、インターネットの世界において夜中の12時って結構activeな時間帯ですよね。その24:00にapache再起動させんの??確かに一瞬かもしれないけどそれっていいの?と思ったわけです。

そこで5:00-29:00を一日の期間としてlogを取ることにしました。で、cronで29:00にrotateさせるのですが29:00とは言ってもこの時点でファイル名につけたい日付は変わっているので昨日の日付を取得するスクリプトを作成したわけです。

このようなわけで、cronは

0               5       *       *       *       root    /opt/local/sbin/logrotate /opt/local/etc/logrotate.d/apache.conf

としています。