如何用Go语言匹配包含error或warn(大小写不敏感)的整行日志
Go语言实现匹配含WARN/ERROR的日志整行
问题根源分析
你之前的两个正则问题出在这:
(?is)error|warn:仅匹配关键词本身,没有用通配符包裹,所以只能捕获到"error"或"warn",拿不到整行。(?is).*error.*|.*warn.*:无输出大概率是正则写法冗余((?s)单行模式在这里没必要,因为逐行处理时每行不含换行符),加上|的优先级容易引发混淆,换个更清晰的写法就能解决。
正确实现方案
Go的regexp用的是RE2引擎,针对逐行日志匹配,我们可以这么做:
1. 编译正确的正则
使用(?i)开启大小写不敏感,用.*(?:error|warn).*匹配包含任意位置关键词的整行,非捕获组(?:error|warn)还能稍微提升性能:
re := regexp.MustCompile(`(?i).*(?:error|warn).*`)
2. 逐行扫描日志并匹配
用bufio.Scanner逐行读取日志,对每行用MatchString判断是否匹配,匹配则输出整行:
package main import ( "bufio" "fmt" "os" "regexp" ) func main() { // 编译大小写不敏感的匹配正则 re := regexp.MustCompile(`(?i).*(?:error|warn).*`) // 替换为你的日志文件路径 file, err := os.Open("your-log-file.log") if err != nil { fmt.Printf("无法打开文件: %v\n", err) return } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() if re.MatchString(line) { fmt.Println(line) } } if err := scanner.Err(); err != nil { fmt.Printf("读取文件出错: %v\n", err) } }
额外说明
- 不要用
(?s)单行模式:因为我们是逐行处理,每行本身没有换行符,(?s)会让.匹配换行,但在这里完全没必要,反而可能引发误解。 - 优先用
MatchString而非FindString:MatchString直接判断整行是否符合匹配规则,而FindString是找行内的匹配子串,前者更符合你的需求。
内容的提问来源于stack exchange,提问作者unsafe_where_true
相关产品推荐
相关产品推荐

