我试图使用正则表达式从日志文件中获取SQL信息
我需要的信息是SQL的运行时间,SQL语句,SQL的参数
这是我的代码:
package main
import (
"os"
"fmt"
"io/ioutil"
"regexp"
)
func main(){
file,err:=os.OpenFile("./log.txt",os.O_RDWR,0755)
if err !=nil{
fmt.Println(err)
}
b,err:=ioutil.ReadAll(file)
str:=string(b)
r,err:=regexp.Compile(`\[ORM\][\w\W]+?(\d*.\d*ms|\d*.\d*s)\][ -]+\[([\w\W]+?)\]`)
s:=r.FindAllStringSubmatch(str,-1)
fmt.Println(s[0][3])
fmt.Println(s[1][3])
}
这是我的日志样本
[ORM] 2018/08/03 10:23:50-[查询/读取]-[OK / db.Query / 432.4ms]-[SELECT acc。*,gp.group_name,gp.group_id,org。 org_name,group_concat(r.role_name)角色名 从sys_account acc 在org.org_id = acc.org_id上左加入sys_org org 在gp.group_id = org.group_id上左加入sys_group gp 在ar.acct_id = acc.acct_id和ar.is_del = 0上向左加入sys_account_role ar 在r.role_id = ar.role_id上向左加入sys_role r,其中1 = 1和acc.acct_type = 1按acc.acct_id顺序按acc.create_time desc LIMIT限制0、15]-`1` ASDFASDF` nsq消费者2:INF 13 [RYOLST_Ch_admin / crm](192.168.1.233:4150)从nsqd收到CLOSE_WAIT nsq Consumer2:INF 13 [RYOLST_Ch_admin / crm](192.168.1.233:4150)开始关闭 nsq消费者2:INF 13 [RYOLST_Ch_admin / crm](192.168.1.233:4150)readLoop正在退出 nsq消费者2:INF 13 [RYOLST_Ch_admin / crm](192.168.1.233:4150)脱离writeLoop nsq消费者2:INF 13 [RYOLST_Ch_admin / crm](192.168.1.233:4150)writeLoop正在退出 [ORM] 2018/08/03 10:23:50-[查询/默认]-[确定/ db.Query / 0.6ms]-[从sys_group中选择*其中group_id =? ]-`111``qwqwqw`
我希望如此打印出
`1``ASDFASDF`
`111``qwqwqw`
我现在剩下的最后一个参数是我无法得到的
这些参数可能会或可能不会多个,文件中也可能包含太多参数
我自己尝试过:
r,err:=regexp.Compile(`\[ORM\][\w\W]+?(\d*.\d*ms|\d*.\d*s)\][ -]+\[([\w\W]+?)\][ -]*((\W\w*\W{1,2})*)`)
r,err:=regexp.Compile(`\[ORM\][\w\W]+?(\d*.\d*ms|\d*.\d*s)\][ -]+\[([\w\W]+?)\][- ]*([^\n]*)`)
答案 0 :(得分:0)
您可能想要这样的正则表达式:
var re = regexp.MustCompile(`\[ORM\][^-]* -\[[^]]*\] - \[ .* / .* / ([^]]*)] - \[([^]]*)\] - (.*)`)
https://play.golang.org/p/MUBzaiyyCWt
这假设数据格式正确,每行一个条目。如果不是这样,您可能将无法使用正则表达式进行解析,即使这样,也会对不包含字符串[]的查询做出一些假设(您可能会忽略)。
首先,我会仔细检查您是否绝对不能首先以正确的格式获得此数据输出-如果可以的话,直接获得所需的输出会更好,甚至有单独的日志,甚至更好地将类似的指标发送到时间序列数据库以供以后分析。解析此类信息的日志不是很好,特别是如果持续进行的话。
如果必须解析日志,请提供一些有关测试的建议: