如何过滤错误日志中的TLS握手错误信息?
过滤Go HTTP服务器的TLS握手错误日志
方法一:自定义错误日志记录器(代码层面)
Go的http.Server支持替换默认错误日志记录器,你可以通过自定义逻辑过滤掉特定的TLS握手错误。核心思路是检查日志内容中的关键词,跳过无需关注的条目。
示例代码:
import ( "fmt" "log" "os" "strings" "net/http" ) // 自定义过滤日志器 type filteredErrorLogger struct { inner *log.Logger } func (l *filteredErrorLogger) Println(v ...interface{}) { // 将日志条目转为字符串 logMsg := strings.Join(strings.Fields(fmt.Sprint(v...)), " ") // 定义需要过滤的错误关键词 skipKeywords := []string{ "connection reset by peer", "EOF", "client requested unsupported application protocols", } // 检查是否包含需要过滤的关键词,是则跳过 for _, kw := range skipKeywords { if strings.Contains(logMsg, kw) { return } } // 非过滤日志正常输出 l.inner.Println(v...) } func main() { // 初始化自定义日志器 logger := &filteredErrorLogger{ inner: log.New(os.Stderr, "", log.LstdFlags), } // 创建HTTP服务器并绑定自定义错误日志 server := &http.Server{ Addr: ":443", Handler: yourHandler, ErrorLog: logger, // 配置你的TLSConfig... } // 启动服务器 if err := server.ListenAndServeTLS("cert.pem", "key.pem"); err != nil && err != http.ErrServerClosed { log.Fatalf("服务器启动失败: %v", err) } }
方法二:运维层面过滤(命令行工具)
如果不想修改代码,可在日志输出或收集阶段用命令行工具过滤。比如用grep反向匹配需要排除的关键词:
实时查看过滤后的日志
tail -f your-app-error.log | grep -v -E "(connection reset by peer|EOF|client requested unsupported application protocols)"
将过滤后的日志写入文件
./your-app 2>&1 | grep -v -E "(connection reset by peer|EOF|client requested unsupported application protocols)" >> filtered-app.log
注意事项
- 代码层面过滤更灵活,也可以通过解析错误类型(如
net.OpError)来判断,但字符串匹配对这类场景已经足够简单有效。 - 命令行过滤适合临时调试或已部署服务的快速日志调整。
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

