Go语言http.Server的ErrorLog字段会输出哪些错误?哪些场景触发?
http.Server 结构体 ErrorLog 字段的作用与触发场景
这个字段是 net/http 包内置的内部错误日志通道,只会输出包自身运行时产生的、无法传递给业务 Handler 处理的底层错误——你自己写的业务代码里的所有错误,都不会走到这个通道输出。
会触发日志输出的典型场景
- 底层连接类异常:连接建立后,在HTTP请求完成路由分发前,客户端突然断开链路、传输过程中网络中断,这类错误因为还没交到业务代码手里,服务端没法通过正常的错误流程返回,只能靠这个日志输出
- HTTP协议解析类错误:客户端发的请求完全不符合HTTP规范,比如请求行格式乱码、请求头总大小超过Server设置的
MaxHeaderBytes阈值、Cookie格式不合法、HTTP/2升级握手阶段的解析失败 - 服务端可恢复运行错误:TCP连接accept阶段的非致命报错、长连接keepalive保活流程的异常、往已经关闭的连接写响应时的底层IO错误
明确不会触发该日志的场景
- 业务Handler内部抛出的错误、panic、自己捕获到的连接中断,这类错误完全由你的业务逻辑管控,不会进入这个日志通道
- 服务端已经把完整响应发出去之后,客户端主动断开连接的操作
- 你在业务代码里自定义校验的请求体过大、参数非法等业务规则类错误
针对提到的两个场景的明确判断
- 网络中断:只有当中断发生在请求被路由到业务Handler之前时,才会触发这个日志;如果请求已经完整交给Handler处理,后面发生的中断是你的代码可以感知到的,不会走这个日志
- 请求过大:只有当超限的是请求头、且总大小超过Server配置的
MaxHeaderBytes时才会触发;如果是请求体大小超限,属于你自己业务代码里的判断逻辑,不会触发这个日志的输出
实用补充
- 如果你不给
ErrorLog赋值,net/http默认就会用标准库的log.Default()输出这些内部错误,和示例代码里的赋值效果完全一样 - 如果不想被这些内部日志干扰,可以把这个字段设置为丢弃输出的日志实例:
ErrorLog: log.New(io.Discard, "", 0)
内容的提问来源于stack exchange,提问作者IvanD
相关产品推荐
相关产品推荐

