ほんま、いつまでサーバの設定やってねん!って感じです。
インフラ担当の必要性を強く感じつつも、僕が目指すのは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
としています。