1

I'm trying to understand the purpose of an ErrorLog struct field in http.Server struct. By its name I suspect that those are some kind of errors, but which ones?

What would trigger errors being outputted there? Broken network? Too large http requests?

package main

import (
    "log"
    "net/http"
)

func main() {
    _ = &http.Server{
        ErrorLog: log.Default(), // what errors are outputted here?
    }
}
blackgreen
  • 34,072
  • 23
  • 111
  • 129
IvanD
  • 2,728
  • 14
  • 26

2 Answers2

1

The official documentation provides an overview of how the field is used:

    // ErrorLog specifies an optional logger for errors accepting
    // connections, unexpected behavior from handlers, and
    // underlying FileSystem errors.
    // If nil, logging is done via the log package's standard logger.
    ErrorLog *log.Logger // Go 1.3

In practice, the field is accessed in the *http.Server's logf method. You can check where that method is called. In short (not exhaustive):

  • on panics serving HTTP requests (conn's serve(ctx context.Context))
  • on TLS handshake errors
  • on the server's Serve(l net.Listener) error errors
  • on writing non-empty data to the response, if the connection was hijacked
  • if the Content-Length is invalid
  • if you call WriteHeader(code int) on the same response more than once
  • if Content-Length and non-identity Transfer-Encoding headers are used together
blackgreen
  • 34,072
  • 23
  • 111
  • 129
0
 type serverErrorLogWriter struct{}
    
    func (*serverErrorLogWriter) Write(p []byte) (int, error) {
        m := string(p)
        if strings.HasPrefix(m, "http: TLS handshake error") && strings.HasSuffix(m, ": EOF\n") {
            // handle EOF error
        } else {
            // handle other errors
        }
        return len(p), nil
    }
    
    func newServerErrorLog() *log.Logger {
        return log.New(&serverErrorLogWriter{}, "", 0)
    }

And then

ErrorLog:          log.New(&serverErrorLogWriter{}, "", 0)
Nizar
  • 500
  • 3
  • 12