読者です 読者をやめる 読者になる 読者になる

アクセスログ解析

dev groovy

たいしたものではないですが、GroovyでApacheアクセスログを解析するスクリプトを作ったので晒します。

import java.text.*

def sdf = new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss", Locale.US)
def sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:00-HH:59")

def count = [:]
new File('access_log').eachLine {
	if( it =~ /.do/ ) {
		def record = it.split(' ')
		def d = sdf.parse(record[3])
		def key = sdf2.format(d)
		if(count[key]) {
			count[key] = count[key] + 1
		} else {
			count[key] = 1
		}
	}
}

count.each{ k,v ->
	println "[$k] ${v.toString().padLeft(6,' ')}"
}

アクセスログから".do"を含む行を抜き出して、1時間ごとに集計します。ちょっと冗長なところもありますが、可読性重視ということで。。。
出力結果はこんな感じ。

[2009/02/23 06:00-06:59]     43
[2009/02/23 07:00-07:59]    201
[2009/02/23 08:00-08:59]   1297

String.padLeft()で右詰めしているのがGroovyならでは。Javaだと一筋縄でいかないとこです。
あと、SimpleDateFormatでLocale.USを指定しているのは、月の表記が"Feb"とかになっているのを正しく扱うためです。日本語環境だと、フォーマット文字列をMMMにしても数字表記のままで、MMMMにすると"2月"のように漢字表記になっちゃいます。