Windows での logrotate
- Date
- 2007-08-23 (Thu)
- Category
- symfony
Unix には logrotate というログの管理をやってくれる便利なツールがあります。管理というとあれですが、一つの機能として、アプリケーションが取り溜めた古い log ファイルを新しいファイルに切り替えて、ある程度古くなったものは廃棄します。これが revolver を rotate(回転)するような感覚なんでしょうか。
昨日の続きなんですが、Windows 環境で、そのようなユーティリティを探していました。と、そこで、Apache 自身に付属するツールで、rotatelogs.exe というのがあるのを知りました。どれどれどんな使い方…と思って調べてみると…
Apache Rotatelogs.exe for Windows Server
Conclusion: It is unusable and dangerous (it will eat up all your memory/file handlers ...etc...). You can not even use rotatelogs.exe on 4+ sites, Apache will lockup when starting (tested on Apache 2.2.0).
だそうです。バギーじゃなぁ…で、同じサイトで以下のような記事も見つけました。
Apache Better Log Rotation mod_log_rotate
Using the module mod_log_rotate, the log rotation is handled by the server process so you save on the process count and file descriptors. I've compiled that code for windows using VC++ 6 for Apache 2.0.x and Apache 2.2.x. You can find the windows binaries of mod_log_rotate at the bottom of this article.
アイデアとしてはアリですが、どうせ logrotate するなら、php のログもやりたいと思っていたのでちょっともの足りません。
で、暫く後に Apache+Windows2000小技集 というページを見つけて、Windows 付属の Shell script を使って、処理するという方法に落ち着きました。kamo 氏は2つの方法を示していますが、『日付をファイル名に持たせて保存する方式』にすこし改良を加えて使うようにしました。
' logArc.vbs ' original idea: http://kamoland.com/comp/apache_win2k.html
apacheExe = """C:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe""" stopApache = apacheExe & " -w -n ""Apache2"" -k stop" startApache = apacheExe & " -w -n ""Apache2"" -k start"
Set logs = CreateObject("Scripting.Dictionary")
logs.Add "main-access", "C:\var\logs\httpd\httpd-access.log" logs.Add "main-error", "C:\var\logs\httpd\httpd-error.log" ... logs.Add "php-error", "C:\var\logs\php\php-error.log"
archive = "C:\var\logs\archive\" today = Fmt( year(now), 4) & Fmt( month(now), 2) & Fmt( day(now), 2)
Dim wsh Dim fso, fo
Set wsh = WScript.CreateObject("WScript.Shell")
On Error Resume Next wsh.Run stopApache, 1, TRUE
If Err.Number = 0 Then
For Each name In logs.Keys Set fso = WScript.CreateObject( "Scripting.FileSystemObject" ) Set fo = fso.GetFile( logs(name) ) fo.move( archive & today & "_" & name & ".log" ) If Err.Number <> 0 Then 'MsgBox Err.Description & "(" & Err.Source & ")" Exit For End If Err.Clear Next
End If
wsh.Run startApache, 1, TRUE
Function Fmt( num, digit) Fmt = Right( String(digit, "0") & num, digit) End Function
暫く職場で VBScript on ASP をやっていたのが効いているのか、結構すぐ出来ました。VB なんて知らねぇよ、という人のために少し解説すると…
apacheExe = """C:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe""" stopApache = apacheExe & " -w -n ""Apache2"" -k stop" startApache = apacheExe & " -w -n ""Apache2"" -k start"
ここでは "" (ダブルクォート2つ) や """ (ダブルクォート3つ) が出てきます。僕は Wiki? 下と思いましたが… Java など一般的には、"~~~" のようにダブルクォートで囲まれた間は文字列として処理されます。VB でも同じなんですが、そのダブルクォートでの文字列表現内で、文字としてダブルクォートを使いたい場合どうするか。同じく Java など一般的には \ (バックスラッシュ) を escape 記号として "~~\"~~" のように使う場合が多いんですが、Windows でバックスラッシュには、directory 区切り記号、という大事な役割があり使えません(たぶん)?そこで "" というふうにダブルクォートを2つ使うんですね。最初の3つは、文字列表現の始まりを示すのと、エスケープされたダブルクォートが連なっている、ということですね。
logs.Add "main-access", "C:\var\logs\httpd\httpd-access.log" logs.Add "main-error", "C:\var\logs\httpd\httpd-error.log" ... logs.Add "php-error", "C:\var\logs\php\php-error.log"
ここの部分で、一緒に処理するファイル群を指定しています。どんなファイルでも OK 。もちろん、ファイルロックが掛けられているとダメですが…
On Error Resume Next wsh.Run stopApache, 1, TRUE
If Err.Number = 0 Then
For Each name In logs.Keys Set fso = WScript.CreateObject( "Scripting.FileSystemObject" ) Set fo = fso.GetFile( logs(name) ) fo.move( archive & today & "_" & name & ".log" ) If Err.Number <> 0 Then 'MsgBox Err.Description & "(" & Err.Source & ")" Exit For End If Err.Clear Next
End If
エラー処理を含めた、ファイル処理ですが、On Error Resume Next とすることで、エラーが起きても、プログラムが絶対止まらないようになります。エラーがおきそうな処理のすぐ下で、エラーが起きてないかを確認してから進めないと行けない、という鬼仕様。。If Err.Number = 0 Then はエラーが起きてない時(= (イコールサイン一つ) は普通、代入に使われ、if 節などの比較コンテキストではなんと比較演算子として処理されます。ま、Macromedia Director の Lingo も同じでしたね…)、If Err.Number <> 0 Then はエラーが起こった時に次のブロックが実行されます。
Comment:0
Trackback:0
- TrackBack URL for this entry
- http://blogs.grf-design.com/mt/mt-tb.cgi/231
- Listed below are links to weblogs that reference
- Windows での logrotate from The Croton