Warum sollte ich log.Println anstelle von fmt.Println verwenden?

76

Aus log.go (der Implementierung des Protokollpakets):

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.Printlnist nur ein Funktions-Wrapper für fmt.Sprintln, warum sollte ich ihn anstelle von fmt.Printlnoder verwenden fmt.Sprintln?

Irgendwelche praktischen Gründe?

Tarrsalah
quelle

Antworten:

106

Zwei Dinge sind unterschiedlich:

  1. Das Drucken über das Paketprotokoll ist vor gleichzeitigen Goroutinen sicher (während dies fmtnicht der Fall ist).

  2. Das Protokoll kann automatisch Zeitinformationen hinzufügen.

Das sind also zwei völlig verschiedene Dinge. Protokoll dient zur Protokollierung und fmtFormatierung. (Okay, log verwendet die gleichen Verben und Flags, aber das ist nur praktisch).

Volker
quelle
1
Ich mag Log wegen des Zeitstempels. Der Nachteil bei der Verwendung von Log ist, dass es immer in stderr schreibt.
Rem7
16
@ rem7 es meldet sich os.Stderrdurch Standard . Rufen log.SetOutputSie einfach an, um es an einen zu senden io.Writer(der sogar ein sein könnte bytes.Buffer).
Dave C
26
Bitte können Sie Codebeispiel fürlog is safe from concurrent goroutines
bsbak
Diskussionen zur Sicherheit von logund fmtin Goroutinen finden Sie unter stackoverflow.com/questions/14694088/…
z11i