首页 > 解决方案 > golang正则表达式获取日志文件中的SQL语句

问题描述

我尝试通过golang的正则表达式获取日志文件中的SQL语句,但是匹配结果出现了一些问题。如果SQL没有在代码中断行,可以得到正确的结果,但是如果它很长并且在代码中分成多行,我的SQL只能是第一行的一部分。我的期望是得到两个完整的SQL 下面是我的代码和一些示例日志

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "regexp"
)

func main() {
    file, err := os.OpenFile("/home/gopath/src/log.txt", os.O_RDWR, 0766)
    if err != nil {
        fmt.Println(err)
    }
    res, err := ioutil.ReadAll(file)
    reg := regexp.MustCompile(`\[ORM\].*`)
    str := reg.FindAllStringSubmatch(string(res), -1)
    fmt.Println(str)
}

INF 13 [RYOLST_Ch_admin/crm] (192.168.1.233:4150) 突破 writeLoop nsq consumer2: INF 13 [RYOLST_Ch_admin/crm] (192.168.1.233:4150) writeLoop 退出 [ORM]2018/08/03 10:23:50 -[查询/默认] - [OK / db.Query / 0.6ms] - [select * from sys_group where group_id=? ] -1

标签: sqlregexgologging

解决方案


试试这个模式:\[ORM\][\w\W]+?\wms\][ -]+\[([\w\W]+?)\].

解释:

\[ORM\]- 匹配[ORM]

[\w\W]+?\wms- 匹配任何字符(包括\n),直到\wms找到(\w是单词字符,也可以是数字) - 非贪婪,所以它在第一次出现时停止\wms,所以直到第二个 SQL 日志才会捕获。

([\w\W]+?)\]- 捕获组,将包含完整的 SQL 语句,再次对任何字符进行非贪婪搜索,与上述类似。

演示


推荐阅读