查看mysql慢查询日志位置:
show variables like 'slow_query%'; show variables like 'long_query_time%';
mysql慢查询日志的记录格式:
# Time: 2020-08-19T11:24:19.810484Z
# User@Host: root[root] @ localhost [] Id: 2
# Query_time: 2.000562 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1597836259;
select sleep(2);
第一行:语句的执行时间
第二行:用户名及IP
第三行:执行时间,锁表时间,总返回条目数,总的扫描结果
第四行:时间戳
第五行:执行的语句
收集日志流程:先使用多行合并插件multiline 将5行合并为一行,再使用过滤将需要的字段过滤出来,再将字段输入es。
对 multiline 插件来说,有三个设置比较重要:negate、pattern 和 what。
negate
- 类型是 boolean
- 默认为 false
否定正则表达式(如果没有匹配的话)。
pattern
- 必须设置
- 类型为 string
- 没有默认值
要匹配的正则表达式。
what
- 必须设置
- 可以为 previous 或 next
- 没有默认值
如果正则表达式匹配了,那么该事件是属于下一个或是前一个事件?
input{
file{
path => "/usr/local/mysql/data/mysql/elk-server-slow.log"
type => "mysql"
codec => multiline {
pattern => "^# Time" #说明:匹配以# Time开头的行,如果不是,那肯定是属于前一行的。
what => "previous"
negate => true
auto_flush_interval => 5
}
}
}
解析时,最后一行日志,不会解析。只有当再追加一条日志时,才会解析最后一条日志。
可以加一个auto_flush_interval参数,当过时间后最后一行就会被加进来。
运行logstash查看效果:
接下来就是分割字段:(写正则的时候可以使用kibana的开发工具中的Grok Debugger进行正则的调试,也可以使用一些在线正则网站)
filter {
grok {
match => {"message" => "%{NOTSPACE}\s+%{NOTSPACE}\s+%{TIMESTAMP_ISO8601:Date_time}.{1}%{NOTSPACE}\s+%{NOTSPACE}\s+%{NOTSPACE:User}\s+@\s+(?<Host>.*\])\s+%{NOTSPACE}\s+%{INT:ID}.{1}%{NOTSPACE}\s+%{NOTSPACE}\s+%{USERNAME:Query_time}\s+%{NOTSPACE}\s+%{USERNAME:Lock_time}\s+%{NOTSPACE}\s+%{USERNAME:Rows_sent}\s+%{NOTSPACE}\s+%{USERNAME:Rows_examined}.{1}%{NOTSPACE}\s+[a-z]+[=][0-9]+[;].{1}(?<command>.*)"}
}
mutate {
remove_field => ["@version"]
remove_field => ["@_id"]
remove_field => ["@_type"]
convert => ["Query_time", "integer"] #修改字段类型
convert => ["Lock_time", "integer"] #修改字段类型
convert => ["Rows_sent", "integer"] #修改字段类型
convert => ["Rows_examined", "integer"] #修改字段类型
}
}
utput{
if [type] == "mysql" {
stdout{codec => rubydebug}
elasticsearch {
hosts => ["192.168.1.135:9200"]
index => "mysql-slow-%{+YYYY.MM.dd}"
}
}
}
查看logstash日志:
打开kibana创建索引并查看: