November 23, 2003

Apache ログ管理

いままでほっておいたら、つけが回ってきたという感じです。そう、Apacheのログの管理をしていなかったために、ログファイルが膨大になっていました。なんと15MB
仕方がないので自動分割の設定、および既存のログファイルの分割にチャレンジしてみました。

自動分割の仕方はApacheのマニュアルに書いてあったので、簡単でした。
httpd.confに以下のコードを追加(/path/to/apacheは適宜読み替えてください)

TransferLog "| /path/to/apache/bin/rotatelogs /path/to/apache/logs/access_log 604800"

これで自動的に1週間=7*24*60*60=604800[sec]ごとにログの自動分割(ローテート)をしてくれます。604800をすきな分割時間間隔にかえればそれに従うようです。ついでにデフォルトではUserAgentやRefererのログは取り込まないようでしたので、それも修正しました。同じくhttpd.confで
CustomLog /path/to/apache/logs/access_log common

をコメントアウトして、そのすぐそばにある
#CustomLog /path/to/apache/logs/access_log combined

を有効にしました。こうすればUserAgentやRefererのログもとってくれるようになります。最後に
$ sudo apachectl graceful

を忘れないよう!!(これでhttpd.confの設定が反映されます)


次に既存のログの分割ですが、手動でやるのによいツールがないようなので、Rubyでスクリプトを書いてしまいました。
rotatelogs.rb

#/usr/local/bin/ruby
INTERVAL = 7 * 24 * 60 * 60
fname = ARGV.shift
open(fname){|f|
    f.each{|line|
        if (line =~ /\[(\d*)/(\s*)/(\d*)[^\]]*\]/) != nil then
            time = Time.gm($3, $2, $1)
            File.open(fname + "." + (INTERVAL * (time.to_i / INTERVAL).to_i).to_s , "a"){|f2|
                f2 << line
            }
        end
    }
}

これで上の自動分割と同じように既存のログファイルの分割もできます。使い方は
$sudo ruby rotatelogs.rb /path/to/apache/logs/access_log

で、intervalの値を換えれば分割時間幅がかわります。

00:51 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/96
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。