Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
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(.*)\\?") // Pattern is this: "Completed in 100ms (View: 25, DB: 75) | 200 OK [http://app.domain.com?params=here]" val times = Map[String, AccumulatedTime]() def parseLine(pattern: Pattern, line: String){ // For each log entry do this 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 } }
This paste will be private.
From the Design Piracy series on my blog: