Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 開発環境
- // Groovy Version: 1.8.6
- // JVM: 1.6.0_24 Vendor: Sun Microsystems Inc.
- // OS: Ubuntu Linux
- def enc = 'EUC-JP'
- if(args.size() < 1){
- println new String("第一引数にログファイル名を指定してください".bytes,enc)
- return
- }
- def report = [:]
- def timeRange = new TimeRange()
- // ログ情報にない集計範囲の情報を出力
- while(timeRange.checkLimit()){
- report[timeRange.startTime.format("HH:mm")] = new ReportRecord()
- timeRange.nextRange()
- }
- new File(args[0]).newReader(enc).eachLine() {line ->
- // レコードの読み込み
- def logInfo = line.split('\t')
- Date date = new Date(logInfo[0])
- def time = logInfo[2] as Integer
- // どの集計時刻に集計されるか特定する
- def hour = date.hours as String
- def minutes = (date.minutes/5) as Integer
- minutes = minutes * 5 as String
- def key = "${hour.padLeft(2,"0")}:${minutes.padLeft(2,"0")}"
- // ログの応答時間を追加する
- def reportRecord = report[key]
- reportRecord.values << time
- }
- // 集計結果を出力
- report.each {k,v ->
- def row = "$k\t${v.getResult()}" as String
- println new String(row.bytes,enc)
- }
- // 集計時刻の範囲を表現するクラス
- class TimeRange {
- // 集計時刻
- Date startTime
- Date endTime
- // 完了時間
- Date limit
- TimeRange(){
- // 集計を行う時間00:00から23:59で初期化
- endTime = new Date()
- endTime.setHours(0)
- endTime.setMinutes(0)
- endTime.setSeconds(0)
- nextRange()
- use( [org.codehaus.groovy.runtime.TimeCategory] ){
- limit = endTime + 1.days
- }
- }
- /** whileループ判定に使う完了時間のチェック */
- boolean checkLimit(){
- return endTime < limit
- }
- // 集計時刻の範囲を次にすすめる
- void nextRange(){
- startTime = endTime
- use( [org.codehaus.groovy.runtime.TimeCategory] ){
- endTime = startTime + 5.minute
- }
- }
- }
- // レポートの集計情報を表現するクラス
- class ReportRecord {
- // 集計する応答時間
- def values = []
- // 集計時刻単位の集計レコードを出力
- String getResult(){
- def counter = [0,0,0]
- def average = 0
- if (values.size() != 0){
- counter[0] = (values.findAll{it < 1000}.size())
- counter[1] = values.findAll{it > 1000 && it < 5000 }.size()
- counter[2] = values.findAll{it > 5000}.size()
- average = Math.floor(values.sum() / values.size()) as Integer
- }
- return "${counter[0]}\t${counter[1]}\t${counter[2]}\t$average"
- }
- }
Add Comment
Please, Sign In to add comment