最新のアクセスログを整形して表示することを考える.
まずは,ファイル名の指定である.
さくらインターネットの提供する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