如果这应该被归类为除了提案之外的事物,我道歉,请根据需要自由更改。它似乎并不像一个错误,而且没有其他事物看起来像一个好的匹配项。
当前状态
如果 http.Serve
在处理请求(但在通过 ServeHTTP
将请求发送给任何处理程序之前)时遇到错误,有时会向客户端发送 HTTP 响应,而不会执行日志记录以通知操作员请求甚至发生。值得注意的情况包括:
- http 请求中的不支持的传输编码(而非响应)
- 不支持/格式错误的 HTTP 协议版本
- 缺失/格式错误的主机头
- 无效的头名称/值
- 格式错误的方法/http 请求
- HTTP 请求头的最大长度超过
http.Server
没有设置钩子以允许这些请求的自定义访问日志消息,但确实有一个 ErrorLog
属性。然而,它并未用于记录这些失败。它用于记录其他每个请求的错误,如下所示:
- 无效的上下文长度
- 多余的/无效的尝试写入响应的调用
- TLS 握手失败
- 在提供请求时遇到的恢复恐慌
- 如果启用,关于查询参数用分号分隔的警告
建议
快速简便
我们将 logf()
调用添加到 serve()
函数中,以记录在发送响应之前遇到的失败。
全面且灵活
- 添加一个新的
http.AccessLogger
接口,其中包含一个功能:ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
- 为人们提供内置的 AccessLog 处理程序,以便他们不必自己实现。
- 为
http.Server
(默认为 nil)添加一个AccessLog http.AccessLogger
属性,如果存在,则在向客户端写入任何响应时调用。目前,http.Server
的消费者需要自己提供访问日志功能,但无法捕获所有发送给客户端的响应。这将使现有访问日志处理程序相对容易地进行替换和选择性使用。
4条答案
按热度按时间dtcbnfnu1#
CC @neild@bradfitz
5tmbdcev2#
如果这些是通过
ErrorLog
记录的,一些用户可能更喜欢静音它,参见#26918。其他用户可能更喜欢收集指标而不是记录,因此替代选项可以是某种RequestErrorHandler
钩子。由于内部错误不会导出,此钩子应接收状态码和可能的状态文本。8oomwypt3#
http2.Server
具有一个CountErr
钩子,当遇到各种错误时会被调用:在这种情况下,
http.Server
上的CountError
是否适用?(在这些错误条件上都调用。)tcbh2hod4#
大家好。这个FR是否有机会得到解决?