go proposal: net/http: log errors during serve()

k2fxgqgv  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(67)

如果这应该被归类为除了提案之外的事物,我道歉,请根据需要自由更改。它似乎并不像一个错误,而且没有其他事物看起来像一个好的匹配项。

当前状态

如果 http.Serve 在处理请求(但在通过 ServeHTTP 将请求发送给任何处理程序之前)时遇到错误,有时会向客户端发送 HTTP 响应,而不会执行日志记录以通知操作员请求甚至发生。值得注意的情况包括:

  • http 请求中的不支持的传输编码(而非响应)
  • 不支持/格式错误的 HTTP 协议版本
  • 缺失/格式错误的主机头
  • 无效的头名称/值
  • 格式错误的方法/http 请求
  • HTTP 请求头的最大长度超过

http.Server 没有设置钩子以允许这些请求的自定义访问日志消息,但确实有一个 ErrorLog 属性。然而,它并未用于记录这些失败。它用于记录其他每个请求的错误,如下所示:

  • 无效的上下文长度
  • 多余的/无效的尝试写入响应的调用
  • TLS 握手失败
  • 在提供请求时遇到的恢复恐慌
  • 如果启用,关于查询参数用分号分隔的警告

建议

快速简便

我们将 logf() 调用添加到 serve() 函数中,以记录在发送响应之前遇到的失败。

全面且灵活

  1. 添加一个新的 http.AccessLogger 接口,其中包含一个功能:ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
  2. 为人们提供内置的 AccessLog 处理程序,以便他们不必自己实现。
  3. http.Server (默认为 nil)添加一个 AccessLog http.AccessLogger 属性,如果存在,则在向客户端写入任何响应时调用。目前,http.Server 的消费者需要自己提供访问日志功能,但无法捕获所有发送给客户端的响应。这将使现有访问日志处理程序相对容易地进行替换和选择性使用。
5tmbdcev

5tmbdcev2#

如果这些是通过ErrorLog记录的,一些用户可能更喜欢静音它,参见#26918。其他用户可能更喜欢收集指标而不是记录,因此替代选项可以是某种RequestErrorHandler钩子。由于内部错误不会导出,此钩子应接收状态码和可能的状态文本。

8oomwypt

8oomwypt3#

http2.Server 具有一个 CountErr 钩子,当遇到各种错误时会被调用:

// CountError, if non-nil, is called on HTTP/2 server errors.
// It's intended to increment a metric for monitoring, such
// as an expvar or Prometheus metric.
// The errType consists of only ASCII word characters.
CountError func(errType string)

在这种情况下,http.Server 上的 CountError 是否适用?(在这些错误条件上都调用。)

tcbh2hod

tcbh2hod4#

大家好。这个FR是否有机会得到解决?

相关问题