用clojure分析mysql慢日志文件

作者: admin 日期: 2018-01-23 12:33:59 人气: - 评论: 0

最近有个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 把字符串转换成整形

相关内容

发表评论
更多 网友评论0 条评论)
暂无评论

Copyright © 2012-2014 我的代码板 Inc. 保留所有权利。

页面耗时0.0236秒, 内存占用1.83 MB, 访问数据库13次

闽ICP备15009223号-1