Apache, Webalizer, Windows
タイトルの組み合わせを使おうとした時、問題が発生する。それは、ログローテションの問題である。Webalizerでログの解析を行っていると、ログファイルがあるサイズを超えた時エラーが出る。解析はできているが、エラーがでたらログファイルの名前を書き換えることで対処している。これはできれば自動化したい処理だ。そこで、ログローテーションを行うことにしたが、調べた結果以下の二つの方法があった。
(1)logrotate
これは、linuxに標準でついているプログラムである。
動作としては、ログファイルを動かした時点で別の名前にして保存する。これがwebalizerを使う場合には望ましい。つまりaccess.logというファイルにログ情報を書き込み、このファイルをwebalizerで解析するように指定しておき、incrementalの設定をしておけば、前回解析した後の分だけを調べるようにできるので、非常に都合がいい。しかし、
これはwindowsでは動かない。cygwinを使っていろいろ設定すればいいのかもしれないが、そこまで調べてはいない。
(2)rotatelogs
これはApacheに標準でついているもので、windowsでも動く。
httpd.confファイルに、以下のような記述をする。
CustomLog “|\”C:/Program Files/Apache Group/Apache2/bin/rotatelogs.exe\” \”C:/Program Files/Apache Group/Apache2/logs/access_%Y%m%d.log\” 86400″ combined
ここで注意点は、Program Filesというようにブランクがあいているディレクトリでは、必ず ” でくくらなければならない。そしてさらにそれに\をつけなければ認識できない。つまり、\”をディレクトリの両端につけなければ、正常に動作しません。Customlog ”|実行ファイル 入力ファイル 実行サイクル” combinedというフォーマットの中に正しくディレクトリの指定をしなければいけない。そうすると上記のような記述になる。
ところが、これは作成するファイルが
access.log_20050515
access.log_20050516
のように名前が変わってしまうので、webalizerでの解析には向いていない。
ということで、両方とも今回の設定では使えないことがわかった。
しかし、やりたいことはわかった。つまり
①アクセスログファイルの名前を固定する。
②そのファイルにapacheから書き込み、webalizerで指定して読み込む。
③一定時間おきに、ログファイルから切り出し、別の名前で保存する。
ということができれば、この問題は解決する。ということで、以下のバッチファイルをいつも午前0時に動かすことで解決できた。
————————————-
cd “C:\Program Files\webalizer”
“C:\Program Files\webalizer\webalizer.exe”
cd “C:\Program Files\Apache Group\Apache2\logs\access”
FOR %%V IN (access.log) DO FOR /F “tokens=1-3 delims=/ ” %%A IN (“%%~tV”) DO copy “%%V” %%A%%B%%C%%~xV
net stop apache2
REN access.log access.bak
COPY access.org access.log
net start apache2
DEL access.bak
————————————–
このファイルにanalyze_and_rotate.batという名前をつけ、
アクセスログが置いてある場所に置く。たとえば、
C:\Program Files\Apache Group\Apache2\logs\access
そして、スタート>すべてのプログラム>アクセサリ>システムツール>タスク
を開き、タスクを作る。
タスクタブで、以下の設定
実行ファイル名 ”C:\Program Files\Apache Group\Apache2\logs\access\analyze_and_rotate.bat”
開始 ”C:\Program Files\Apache Group\Apache2\logs\access”
実行するアカウント名 アドミン権限のアカウントとパスワードの設定
スケジュールタブで以下の設定
タスクのスケジュール 日単位
開始時刻 0:00
タスクのスケジュール(日単位) 1日
これで、以下の動作をする。
①午前0時になると、webalizerを起動して解析する。
②ログファイルをコピーして、日付の名前をつける。
③Apacheを止める。
④access.logをaccess.bakに名前を変える。
⑤access.orgをaccess.logという名前でコピーする。
⑥Apacheを開始する。
⑦access.bakを削除する。
ここで、access.orgはテキストファイルを作って、この名前で保存しておく。
これで、毎日のログがその日の日付が入ってバックアップされ、最新の当日ファイルはaccess.logになる。これで運用しており、今のところ問題なく稼動している。
しかし、ここまで調べて自分で作成するまで、けっこう時間がかかっている。できてしまえばたいしたことはないが、ここまでの解決をgoogleで発見できなかった。ただし、googleで探索したおかげで、いくつかのヒントがあり、この解決に達したわけで、googleがなければできなかったかもしれない。そういう意味で、googleは、創造にかかせないツールなのである。
コメントを残す