差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
WindowsでApacheを使うときの小技集.ログ管理用WSHスクリプトなど
//parent=Apache
&include_htmlfile(comp/apache_win2k,http://kamoland.com/comp/);
*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回実行されるようにしておきます.
<itle(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
<itle(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時に実行するようにしています.
#img(http://kamoland.com/comp/image/apache_win2k_01.png,l)
#img(,c)