You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Go语言匹配包含error或warn(大小写不敏感)的整行日志

Go语言实现匹配含WARN/ERROR的日志整行

问题根源分析

你之前的两个正则问题出在这:

  1. (?is)error|warn:仅匹配关键词本身,没有用通配符包裹,所以只能捕获到"error"或"warn",拿不到整行。
  2. (?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:10:50