そういえば使っているスクリプトをずいぶん前に書き換えていたので、とりあえずそれを表に出しとこうかな、という。
以前に出していたスクリプトは行レベルで文字コード判別・変換をするので、アクセスされたURLとRefererのURLの文字コードが違っていると、どちらかが文字化けするという問題点があった。それにきちんとした検索語の把握するために、全角の英数字を半角に直したり、検索語を全て小文字に直すような機能があった方がいいかもしれないことに気がついた。
それでいろいろ考えた末に書き直したのがこのスクリプト。今回はPerlではなくRubyで実装した。それなりに使えそうなコマンドライン引数も入っている。
-dオプションはURLがエンコードされたままの時に指定する。もしもすでにデコードしているログの、文字コードの再解釈だけをしたいときには不要。-iはログの形式が不正な行(newsyslogのメッセージとか)を出力しなくする。
-lオプションは大文字を小文字に直すので、「CleanArchiver」と「cleanarchiver」を同じ検索語としてカウントできるようになる。-wオプションは全角英数を半角英数に直すので、「シムシティ2000」は「シムシティ2000」に変換される。
-oオプションは出力ファイルを指定する。ただし入力ファイルと同じファイルは指定しないこと!先に元のログファイルが破壊されてしまう。-mオプションは-oで作成されるファイルのパーミッションを指定できる。
本当は-oで元のファイルを指定したい場面があると思うんだけど、いまいちいい実装が思い浮かばずとりあえず保留。まー、やっつけスクリプトだしいっか、というところもありつつ。
でも私自身cronでログファイルを入れ替えているので、仕方ないのでシェルスクリプトを挟んでいる。そのスクリプトはこんな感じ。
#!/bin/sh
LOGFILE=/var/log/httpd/access_log.0
TEMPFILE=${LOGFILE}.temp
./logconv.rb -dw -m 0600 -o ${TEMPFILE} ${LOGFILE} && \
mv ${TEMPFILE} ${LOGFILE}
まぁ今度暇なときにファイル入れ換えの実装は考えることにしよう(一時ファイルを作るのに、異なるファイルシステム間をまたがせたくないのよね・・・)。