121

From log.go (the implementation of the log package) :

167 // Println calls l.Output to print to the logger.
168 // Arguments are handled in the manner of fmt.Println.
169 func (l *Logger) Println(v ...interface{}) { l.Output(2, fmt.Sprintln(v...)) }

log.Println is just a function wrapper for fmt.Sprintln , why should I use it instead of fmt.Println or fmt.Sprintln ?

Any practical reasons ?

Salah Eddine Taouririt
  • 24,925
  • 20
  • 60
  • 96

1 Answers1

182

Two things are different:

  1. Printing via package log is safe from concurrent goroutines (while plain fmt isn't)

  2. Log can add timing information automatically.

So these are two completely different things. log is for logging and fmt for formatting. (Okay, log uses the same verbs and flags, but that is just convenient).

SFin
  • 149
  • 13
Volker
  • 40,468
  • 7
  • 81
  • 87
  • 4
    I like Log because of the timestamp. The downside to using Log is that it always writes to stderr. – rem7 Aug 20 '15 at 19:04
  • 34
    @rem7 it logs to `os.Stderr` by *default*. Simply call [`log.SetOutput`](https://golang.org/pkg/log/#SetOutput) to send it to any `io.Writer` (which might even be a `bytes.Buffer`). – Dave C Aug 31 '15 at 17:30
  • 6
    For discussions around the safety of `log` and `fmt` in goroutines, see https://stackoverflow.com/questions/14694088/is-it-safe-for-more-than-one-goroutine-to-print-to-stdout – z11i Jan 21 '20 at 03:14