Apacheアクセスログと私(まずは最新のログファイルを得る)

最新のアクセスログを整形して表示することを考える.

まずは,ファイル名の指定である.

さくらインターネットの提供するApacheログファイルは,決められたディレクトリに「access_log_YYYYMMDD」の名前で格納される.YYYYは西暦4桁,MMは月の2桁表示,DDは日の2桁表示である.最新のファイルはこの名前,前の日のファイルは「access_log_YYYYMMDD.gz」と云う形で圧縮されている.

まず,ここで,TimeクラスやDateクラスでYYYYMMDDにする方法が分からず,関数を作るしかないかとあきらめ,以下の通り関数を作った.

#日付をYYYYMMDDの形式の文字列にする関数
def date_fmt(date)
  date_year = date.year.to_s
  date_month = sprintf("%02d", date.month)
  date_day = sprintf("%02d", date.day)
  return date_year + date_month + date_day
end

さて,ログファイルは,毎日5時前後に作成される.つまり,単純に今日の日付からログファイル名を指定すると,ファイルがまだ作成されていない可能性がある.ここでまた,条件設定だの繰り返し方だのですったもんだしたが,最新のログファイル名を得る関数を作る.

#最新のログファイル(圧縮なし)を取得する関数
def lastlog()
  last = Date.today
  last_s = date_fmt(last)
  #今日の日付から初めて,
  #最新のファイルが見つかるまでログファイルの名前を変える
  logfilename = ""
  i = 0
  until FileTest.exist?(logfilename) do
    last_s = date_fmt(last-i)
    logfilename = LOG_DIR + "access_log_" + last_s
    #ファイルが見つからず無限ループに陥るのを防ぐため,
    #10回でやめる
    i += 1
    break if i == 10
  end
  return logfilename
end

なんか,関数をサブルーチンのように使っちゃってるけど,いいのかなあ.メインの方に書くとごちゃごちゃしてきたから分けたんだけど.

定数「LOG_DIR」は,ログファイルの格納ディレクトリの絶対パスで,「/home/[ユーザー名]/log/」という文字列である.

ファイルがなかったときの処理は,普通なら1日引くだけでいいはずなんだけど,何らかの理由で無かったときのために,10回繰り返している.もっとうまい処理方法はないのだろうか?

ここまでやっといてなんだけど,Dir.globで存在するファイル名を特定する方法の方が良かったんじゃなかろうか?

そこで,Dir.globでいろいろとやってみたんだけど,SecurityErrorが出る.う~ん,なんて名前のファイルがあるか分かってしまうような命令はよろしくないってことかなあ.

ともかく,最新ファイルは取得できるようになった.

2004年10月15日追記

最新のログファイル(圧縮なし)を取得する関数は,until文を使うとiを明示的にカウントアップしなければならないのが美しくないなあと思い,forで書き直した.

logfilename = ""
for i in 0..10
  #ファイルが見つからず無限ループに陥るのを防ぐため,10回だけ判定
  last_s = date_fmt(last-i)
  logfilename = LOG_DIR + "access_log_" + last_s
  break if FileTest.exist?(logfilename) #ファイルがあったらループを抜ける
end

日時: 2004年10月11日 | PC/Web > Ruby |

コメントを投稿

(空欄でもかまいません)

(メールアドレスは管理人に通知されますが,Web上には表示されません)

Powered by Movable Type