投稿アップデート情報 追記(4/12) 追記2(7/14) 追記3(12/20) 追記4(2012/4/11)
分家・本家ともに,徐々にアクセスも増えてきたので,ずっとうっちゃらかしにしてきたApacheログのローテートをやろうと思っていろいろ調べてみた。
Win版Apacheにはrotatelogs.exeというローテーション用のプログラムが同梱されている。ところがこのプログラムかなり深刻なバグがあるという報告があり,いろいろ調べてみてもそのバグが治っているかどうかがよくわからないので,結構よく使われているバッチファイルとタスクスケジューラの組み合わせで月単位のローテートを行うことにした。
で,この記事はその報告。
でも,「ログファイルがロックされていても強引にローテーションを試みる」ってとんでもない基本事項がらみのバクだよな。しかも,rotatelogs.exe自身がロックされてゾンビが残るらしい。ググってみても,このバクがフィックスされているかどうかがわからなかったんだけど,本当に治っていないんだろか。なまじ,完全なる素人は使わないプログラムだけに,みんーな何とか別の方法でやっちゃうから,いまだにほったらかしなのかもね。
何はともあれ,本題に移行。バッチの中身は以下のような感じ。
1. @echo off
2. set DT=%DATE:/=%
3. set DY=%DT:~-2%
4. set MN=%DT:~-4,2%
5. set /a MN=MN-1
6. perl F:Webcgi-binawstats.pl -config=example.com -update
7.
8. if "%DY%"=="01" (goto A) else goto B
9.
10. :A
11. net stop "Apache2.2"
12. taskkill /im vlc.exe
13. move G:Apache2.2logsaccess.log G:Apache2.2logsaccess%MN%.log
14. net start "Apache2.2"
15. G:VideoLANVLCvlc F:minori.flv --loop :sout=#transcode{vcodec=WMV2,vb=512,fps=25,scale=0,acodec=wma2,ab=128,channels=2,samplerate=44100}:std{access=mmsh,mux=asfh,dst=example.com:1234}
16. :B
17. exit /b
6.行はその日のawstatsの集計。12.15.行はストリーミングの関係で走らせているVideoLAN関係なので,我が自鯖だけにしか関係ない。A:の部分が1日の日にだけ行われるようになっているので,月単位でローテートすることになる。
このバッチを1日に1回0:00にタスクスケジューラで走らせる。タスクスケジューラを使うについての注意は,タスクスケジューラで起こしたバッチの優先順位を高にしてやっておくこと。そうしないと結構時間を食うみたい。
C:WINDOWSsystem32cmd.exe /c start /high G:rotate.bat
実行するファイル名のところを上記のような感じにする。
それから,ついでにhttpd.confもちょっとだけ変えた。いままで,すべてのログを一つのファイルに取っていたんだが,アクセスが増えるに従って不正なものも増えてきたので,これは別ログに取ることにした。上記のバッチファイルではその部分は除いている。
追記(4/12):
上に書いてある.batなんだが,実は最終行のexit /bが全く利いていない。なんでかというと,vlc.exeに行った後.batに戻ってこないのだ。vlcから戻ってこさせる方法がわからない。結果としてコマンドプロンプトの窓が一つ開いたまま残る。
いろいろやってみたがどうしてもうまくいかないので,バッチの終了後にタスクスケジューラから,taskkill /im cmd.exeを流して窓を閉じてやることにした。どんくさいが仕方ない。どなたか,いい方法があったらご教示ください。
追記2(7/14):
ここの.batを利用しようと思う方がいたら,「本家のお世話-#5。」にも目を通してください。
追記3(12/20):
12/16から,素直にApacheのrotatelogs.exeを使っている。今のところ順調に動いてくれている。 —->> 本家のお世話-#21。(rotatelogsを使う)。
追記4(2012/4/11):
Apache導入についての新しい記事を,本家のお世話-#28。,本家のお世話-#29。に書いた。