最近有个dba请求我帮忙写个程序把mysql慢日志文件中的指定记录提取出来(比如query_time 时间大于1秒钟的查询)
mysql-slow.log 文件内容如下
用于分析的clojure代码如下
(ns mysql-slow.core
(:require [clojure.java.io :as io]
[clojure.string :as str])
(:gen-class))
(def file-path "G:\\mysql-slow\\mysql-slow.log")
(def min-query-time 1)
(defn include-delimiter? [line]
(if (> (count line) 8)
(= (subs line 0 8)
"# Time: ")
false
)
)
(defn parse-block [block]
(if (> (count block) 0)
(let [match (re-find #"Query_time: (.*?) Lock_time"
block)
query-time (get match 1)]
(if (= (count match) 2)
(if (> (read-string query-time) min-query-time)
(println block)
)
)
)
)
)
(defn -main
"I don't do a whole lot ... yet."
[& args]
(with-open [rdr (io/reader file-path)]
(loop [line (.readLine rdr)
blockBuffer []
newBlock ""]
(parse-block newBlock)
(when line
(if (include-delimiter? line)
(recur (.readLine rdr)
[line]
(apply str
(interleave blockBuffer
(repeat "\n")) )
)
(recur (.readLine rdr)
(conj blockBuffer line)
""
))
)
)
)
)
思路:用loop逐行读取文件使用字符串 "# Time: "作为一个block开始的标志,使用迭代变量blockBuffer来收集block,收集到一个完整的block之后发射给parser-block函数,parser-block函数使用正则表达式匹配出query_time,不过这里匹配出来的query_time 是字符串类型的使用clojure一个特殊的函数read-string 把字符串转换成整形