IvanD
IvanD

Reputation: 2953

What errors are outputted to http.Server's ErrorLog struct field?

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?
    }
}

Upvotes: 1

Views: 908

Answers (2)

Nizar
Nizar

Reputation: 520

 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)

Upvotes: 0

blackgreen
blackgreen

Reputation: 45041

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

Upvotes: 1

Related Questions