ログのローテートを行わなかったために巨大なファイルになってしまった access_log を月別に分割したい。
このサイトでは,ログがローテートして消えていってしまうのを避けるため,/etc/logrotate.d/apache を削除していた。そのため,Apache のログ /var/log/httpd/access_log は巨大なファイルになってしまった。2004年1月からログを採り始め,現在 580 MB にまでなっている。これを月別に分割して,3月分は access_log.200503 のように名前をつけて保存していきたいと思っている(nlog(n): Apache のログを月別に保存したい)。分割して保存するメリットは次の通り。
統計情報集計ソフト Webalizer は過去1年間分の情報しか対象としないので,古いログを分離して処理の対象外とすれば,処理時間の短縮が期待できる。また,古いログを圧縮してしまえば,ディスクの節約になるからである。テキストファイルの場合,約10分の1に圧縮されるのでかなりお得。
しかし,そのためには access_log を月別に分割しなければならない。2004年1月からだと,15分割しなければならない。手作業でもできそうだが,少し楽がしたい。そこで次のような Perl スクリプト monthout.pl を書いた(名前は適当)。Apache のログの日時部分にマッチして,指定した月のものだけを出力する。
使い方は,引数に年と月とファイル名を与えるようにする。例えば 2004年3月分なら次のように指定する。結果は標準出力に出力される。
もちろん,monthout.pl に実行許可を与えておけば,最初の「perl」は不要である。
このスクリプトを使ってファイルに出力するようにするために,次のような Bourne Shell のスクリプト monthout.sh を書いた(これも名前は適当)。
余分に出来てしまう未来のログ access_log.200505 .. access_log.200512 は手で削除する。しかし,考えてみれば2004年分と2005年分を別ループにすれば,余分なファイルは発生しないのだった。失敗した。残念!!..._| ̄|○
つまりこういうことだ。
となると,Y をループにする必要もないことになる。まぁ,気にしないことにしよう。1度しか使わないし…。しかし,よく思い返してみると,この手の作って直ぐに捨てるコードを沢山書いてきて,再利用することは考えていなかったような気がする。ここに残しておけば再利用することがあるかも知れない。
構文のチェックは sh に -xv オプションをつけるとできる(シェルスクリプトのデバッグ
シェルスクリプトのデバッグ - UNIX & Linux コマンド・シェルスクリプト リファレンス)。
元の巨大な access_log は念のためバックアップ。現在は2005年4月なので,httpd を停止した後に,root 権限で monthout.sh を実行し,access_log.200504 を access_log に名前を変更すれば,希望の処理が完了する。
Posted by n at 2005-04-15 00:18 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957