正则表达式不匹配

时间:2018-08-04 12:49:20

标签: python regex go

我试图使用正则表达式从日志文件中获取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]*)`)

1 个答案:

答案 0 :(得分:0)

您可能想要这样的正则表达式:

var re = regexp.MustCompile(`\[ORM\][^-]* -\[[^]]*\] - \[ .* / .* / ([^]]*)] - \[([^]]*)\] - (.*)`)

https://play.golang.org/p/MUBzaiyyCWt

这假设数据格式正确,每行一个条目。如果不是这样,您可能将无法使用正则表达式进行解析,即使这样,也会对不包含字符串[]的查询做出一些假设(您可能会忽略)。

首先,我会仔细检查您是否绝对不能首先以正确的格式获得此数据输出-如果可以的话,直接获得所需的输出会更好,甚至有单独的日志,甚至更好地将类似的指标发送到时间序列数据库以供以后分析。解析此类信息的日志不是很好,特别是如果持续进行的话。

如果必须解析日志,请提供一些有关测试的建议:

  • 使用play.golang.org进行快速测试
  • 使用regexp.MustCompile检查您的regexp作品
  • 创建一个函数以解析行
  • 使用日志中的行编写一些行使功能的测试