import java.util.regex._
import java.io._
import scala.io.Source
import scala.collection.mutable.Map
class AccumulatedTime(var instances: Int, var totalTime: Int, var viewTime: Int, var dbTime: Int) {
def addInstance(total: Int, view: Int, db: Int) {
instances += 1
totalTime += total
viewTime += view
dbTime += db
}
def avgTime = totalTime.toFloat / instances
def avgViewTime = viewTime.toFloat / instances
def avgDbTime = dbTime.toFloat / instances
override def toString = "Total Time: " + totalTime + "ms (View: " + viewTime +"ms DB:" + dbTime + "ms )"
def avgToString = "Average Time: " + avgTime + "ms (View: " + avgViewTime +"ms DB:" + avgDbTime + "ms )"
}
object LogParser {
def main(args: Array[String]) {
val filename = args(0)
if(filename != null){
println("Parsing " + filename)
parseLogFile(filename)
}
}
def parseLogFile(filename: String) {
val results = parseLogFileToMap(filename)
outputCompiledResults(results)
}
def outputCompiledResults(results: Map[String, AccumulatedTime]){
println("Total URIs: " + results.size)
results.foreach({
case(uri, time) => {
println(uri + " => " + time.instances)
println("\t" + time)
println("\t" + time.avgToString)
}
})
}
def parseLogFileToMap(filename: String): Map[String, AccumulatedTime] = {
val p = Pattern.compile("Completed in (\\d+)ms \\(View: (\\d+), DB: (\\d+)\\) \\| (\\d+) OK \\[http://app.domain.com(.*)\\?")
val times = Map[String, AccumulatedTime]()
def parseLine(pattern: Pattern, line: String){
val m = p.matcher(line)
if(m.find){
val totalTime = m.group(1).toInt
val viewTime = m.group(2).toInt
val dbTime = m.group(3).toInt
val responseCode = m.group(4)
val uri = m.group(5)
if(times.contains(uri)) {
times(uri).addInstance(totalTime, viewTime, dbTime)
} else {
times(uri) = new AccumulatedTime(1, totalTime, viewTime, dbTime)
}
}
}
val fstream = new FileInputStream(filename)
val in = new DataInputStream(fstream)
val br = new BufferedReader(new InputStreamReader(in))
def readLine(reader: BufferedReader) {
val line = reader.readLine
if(line == null){
println("Finished parse.")
} else {
parseLine(p, line)
readLine(reader)
}
}
readLine(br)
in.close()
times
}
}