我們的Web應用程序正在將大量'http:response.WriteHeader on hijacked connection'消息記錄到stderr。任何獲取堆棧跟蹤'http:response.WriteHeader on劫持連接'錯誤的方法?
是否有任何方法可以使http
庫輸出堆棧跟蹤或其他調試信息以及此消息(或將其升級爲錯誤),以便能夠跟蹤我們的應用程序中發生這種情況的位置?
我們的Web應用程序正在將大量'http:response.WriteHeader on hijacked connection'消息記錄到stderr。任何獲取堆棧跟蹤'http:response.WriteHeader on劫持連接'錯誤的方法?
是否有任何方法可以使http
庫輸出堆棧跟蹤或其他調試信息以及此消息(或將其升級爲錯誤),以便能夠跟蹤我們的應用程序中發生這種情況的位置?
如果您使用的是調試器,請設置一個斷點on the line where the message is logged。從那裏檢查堆棧。
如果不使用調試器,則暫時在該線路處添加一個呼叫以使其恐慌,並使用go install net/http
重建net/http軟件包。堆棧跟蹤將顯示問題的原因。
另一種選擇是創建一個io.Writer,在每次調用Write時調用debug.PrintStack。使用這位作家create a log.Logger。將此記錄器設置爲server's ErrorLog。檢查打印的堆棧軌跡以找出錯誤的原因。
由於錯誤永遠不會返回,並直接寫入http.Server.ErrorLog
,這是唯一可以截取它的地方。
你可以在調試器中運行它,並在那個時候中斷,但如果這是在生產中運行,那可能沒有用。
您可以使用io.Writer
創建一個新的*log.Logger
,它在遇到特定消息時將堆棧跟蹤添加到輸出。
type stackWriter struct {
w io.Writer
}
func (s stackWriter) Write(d []byte) (int, error) {
if bytes.Contains(d, []byte("WriteHeader on hijacked connection")) {
s.w.Write(debug.Stack())
}
return s.w.Write(d)
}
當然另一種選擇是修改net/http/server.go
在該點打印的堆棧。