sql - 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
解决方案
试试这个模式:\[ORM\][\w\W]+?\wms\][ -]+\[([\w\W]+?)\]
.
解释:
\[ORM\]
- 匹配[ORM]
,
[\w\W]+?\wms
- 匹配任何字符(包括\n
),直到\wms
找到(\w
是单词字符,也可以是数字) - 非贪婪,所以它在第一次出现时停止\wms
,所以直到第二个 SQL 日志才会捕获。
([\w\W]+?)\]
- 捕获组,将包含完整的 SQL 语句,再次对任何字符进行非贪婪搜索,与上述类似。
推荐阅读
- c++ - Qt 资源文件的模拟?
- design-patterns - 如何在序列图中表示无限循环?
- python - 在python中用字母生成所有可能性并在python3中利用结果
- c# - C# DataTable 对象输出
- typescript - TypeScript - 找不到名称“进程”
- python - Pandas 数据框的 Python 集成
- php - 410 如果我在 HTML 输入表单中插入“shell_exec”或“$_SERVER”,则会出错
- ruby-on-rails - Rails/Rspec:未定义的方法 `temp_val' 用于#
- salesforce-lightning - 当我尝试在组件中执行 aura 时它不起作用
- c# - 为什么作用域服务比 dotnet 中的瞬态服务更早部署?