去哪里记录错误?

I'm using the log packages and I'm wondering what's the default destination of the log data. I can't find it anywhere. Do I need a io writer and specifically call it after each log or how is it supposed to work ?

It should be stdErr, as in line 58 of log.go:

var std = New(os.Stderr, "", LstdFlags)

So package methods like Fatal() uses std by default:

// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
    std.Output(2, fmt.Sprint(v...))
    os.Exit(1)
}

The blog post "How to write Go packages coders will love " (by Baron Schwartz) references that technique:

One of the patterns I've found in the standard Go library is what I call package-and-object. (That's my own name; maybe I'm reinventing or naming something already known by another name.) You can see this idiom in several packages. It makes these packages a delight to use.

The essence of the idiom is that you design a type with methods as usual, and then you also place matching functions at the package level itself. These functions simply delegate to a default instance of the type that's a private package-level variable, created in an init() function.

To take a look at the default logging functionality, for example, you can just import the log package and then write things like log.Print(). It's super-concise and handy, and it does the right thing.
Want to customize it? Make your own log.Logger variable, and set its properties.


Note that, with Go 1.13 (Q3 2019), the new Writer() function returns the output destination for the standard logger.