用 bufio.scanner 逐行读取日志。如果日志行可能超过默认容量,先调用 scanner.buffer() 设置上限,再在循环结束后检查 scanner.err()。

设置缓冲上限后逐行计数
保存为 main.go,命令行参数为日志文件路径。示例只统计以 ERROR 加空格开头的行。
package main
import (
"bufio"
"fmt"
"log"
"os"
"strings"
)
func main() {
if len(os.Args) != 2 {
log.Fatal("usage: scan-log FILE")
}
file, err := os.Open(os.Args[1])
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Buffer(make([]byte, 64*1024), 1024*1024)
count := 0
for scanner.Scan() {
if strings.HasPrefix(scanner.Text(), "ERROR ") {
count++
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
fmt.Println(count)
}上限作用于扫描缓冲,换行等分隔数据也可能占用空间。超过上限会报告错误。
用普通日志验证计数
在类 Unix 终端生成练习文件并执行。
printf 'INFO start\nERROR timeout\nERROR failed\n' > demo.log go run main.go demo.log

预期输出 2。
构造超长行验证错误路径
生成一行明显超过 1 MiB 的内容。
python3 -c 'print("ERROR " + "x" * (2 * 1024 * 1024))' > long.log
go run main.go long.log预期出现 token too long 并返回失败。如果业务必须接受超长记录,可以改用 Reader 逐段读取,并定义自己的资源上限。

















