WindowsでApacheを使うときの小技集.ログ管理用WSHスクリプトなど

Apache + Windows2000 小技集

 ApacheをWindowsで使うのは,まあ邪道なんだとは思います.(本来は,UNIX,Linux用だという意味で)

しかし,Linuxがうまく動かない,その他の理由で, 私を含めてWindowsでApacheを使っている人は少なくないのではないかと思います.

そこで,自分の経験に基づいて,WindowsでApacheを動かすときの小技を集めてみます. 参考になれば幸いです.


1. アクセスログの履歴管理

 Apacheのアクセスログは,ほっとくとどんどん巨大化します. なので普通,これを適当なタイミングで別のファイル名で保存しておいて,必要に応じて消去するという作業を行います.

UNIX,Linuxで使う場合は,それ用のシェルスクリプトがインターネット上に転がっているので, それをcronに登録して自動実行させればOKなんですが, Windowsではどうしましょう.

つうわけで,WSH (Windows Scripting Host)を使って簡単なスクリプトを作りました.

WSHが使える環境が必要です.Windows2000は標準で大丈夫,Meも多分OK. NT4.0はWSHをダウンロードして追加する必要あり. (InternetExplorer4か5についているかも)

あと,WSHは特に言語を規定しないのですが,拡張子vbsで判るように,今回はVBScriptを使って書いています.

a) ファイル名に連番を付けて循環使用する方式

 UNIXのログでよく使われている方法です.

最初に呼び出されたとき,
access.log(最新のログ) → access_log.0

次に呼び出されたときは,
access_log.0 → access_log.1
access.log → access_log.0

となり,古いログはどんどん大きい番号に付け変わってゆきます.

この番号は7まで増えます.access_log.7 になったファイルは, その次に呼び出されると消去されます.

このvbsファイルを,タスクスケジューラに登録して,例えば週1回実行されるようにしておきます.

logRot.vbs

' Apache のログをローテイト保存する
' logRot.vbs
' 2001.08.19

' Apache本体
apacheExe = """C:\Program Files\Apache Group\Apache\Apache.exe"""

' 対象ログファイルのフルパス
currentLog = "C:\kamoi\logs\access.log"

stopApache = apacheExe & " -w -n ""Apache"" -k stop"
startApache = apacheExe & " -w -n ""Apache"" -k start"

moveIfExist logDir & "access_log.6", logDir & "access_log.7"
moveIfExist logDir & "access_log.5", logDir & "access_log.6"
moveIfExist logDir & "access_log.4", logDir & "access_log.5"
moveIfExist logDir & "access_log.3", logDir & "access_log.4"
moveIfExist logDir & "access_log.2", logDir & "access_log.3"
moveIfExist logDir & "access_log.1", logDir & "access_log.2"
moveIfExist logDir & "access_log.0", logDir & "access_log.1"

Dim wsh
Set wsh = WScript.CreateObject("WScript.Shell")
wsh.Run stopApache, 1, TRUE

moveIfExist logDir & "access.log", logDir & "access_log.0"

wsh.Run startApache, 1, TRUE

' ファイルの移動.存在確認付き
Function moveIfExist( orgFile, newFile)
  Dim fso, fo
  Set fso = WScript.CreateObject( "Scripting.FileSystemObject")

  if fso.FileExists( orgFile) then
    if fso.FileExists( newFile) then
      fso.DeleteFile newFile
    end if

    Set fo = fso.GetFile( orgFile)
    fo.move( newFile)
  end if
End Function

 シェルスクリプトだと,もっとさらっと書けるんやろなあ...

ポイントとしては,

  • access.logはApache.exeがロックしているので,Apache.exeを止めないとファイル名を変更できない

ぐらいです.

そのため,Apacheを停止,起動するためのコマンド文字列を,前半でstopApache,startApache という変数に設定して,access.logのファイル名変更の前後で, WScript.ShellオブジェクトのRunメソッドを使って実行しています.

b) 保存日付をファイル名に持たせて保存する方式

 こっちは,ファイル名に保存年月日を持たせることで,ファイル名からいつのログなのか判るようにしておく方法です.

例えば,2001年8月19日に保存したログは,次のファイル名になります.
20010819_access.log

logArc.vbs

' Apache のログを別名保存する
' logArc.vbs
' 2001.08.19

' Apache本体
apacheExe = """C:\Program Files\Apache Group\Apache\Apache.exe"""

' 対象ログファイルのフルパス
currentLog = "C:\kamoi\logs\access.log"

stopApache = apacheExe & " -w -n ""Apache"" -k stop"
startApache = apacheExe & " -w -n ""Apache"" -k start"

' 保存先ファイル名
arcLog = "C:\kamoi\logs\" & _
  Fmt( year(now), 4) & Fmt( month(now), 2) & Fmt( day(now), 2) & "_access.log"

Dim wsh
Dim fso, fo

Set wsh = WScript.CreateObject("WScript.Shell")

wsh.Run stopApache, 1, TRUE

Set fso = WScript.CreateObject( "Scripting.FileSystemObject")
Set fo = fso.GetFile( currentLog)
fo.move( arcLog)
wsh.Run startApache, 1, TRUE

' 数値の頭に0を付けて,任意の桁数の文字列にする
Function Fmt( num, digit)
  Fmt = Right( String(digit, "0") & num, digit)
End Function

 ローテイト版とは,ファイル名が違うくらいです.

あと,8→"08"という風に必要に応じて頭に0を付けて桁数を揃えるために, Functionを定義しています.

先頭に0を付けて,右からRight()で必要な桁数分取り出すという,姑息な技を使っています. 昔のBASICのプログラミングを知っている人には,懐かしくて涙ちょちょぎれる技だと思います.

私は,こっちのスクリプトをタスクスケジューラに登録して,毎週月曜日の0時に実行するようにしています.

kamolandをフォローしましょう


© 2017 KMIソフトウェア