Чому я повинен використовувати log.Println замість fmt.Println?


77

З log.go (реалізація пакету журналу):

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це просто оболонка функції, для fmt.Sprintlnчого я повинен використовувати її замість fmt.Printlnабо fmt.Sprintln?

Якісь практичні причини?

Відповіді:


107

Дві речі різні:

  1. Друк через журнал пакетів захищений від одночасних програм (тоді як звичайний fmt- ні)

  2. Журнал може автоматично додавати інформацію про час.

Отже, це дві абсолютно різні речі. log призначений для ведення журналу та fmtформатування. (Гаразд, журнал використовує однакові дієслова та прапори, але це просто зручно).


1
Мені подобається Log із позначкою часу. Недоліком використання журналу є те, що він завжди пише в stderr.
rem7

16
@ rem7 він входить в систему os.Stderrза замовчуванням . Просто зателефонуйте, log.SetOutputщоб надіслати його будь-якому io.Writer(що може бути навіть a bytes.Buffer).
Дейв С

27
Будь ласка, чи можете ви додати приклад коду дляlog is safe from concurrent goroutines
bsbak

Для дискусії навколо безпеки logі fmtв goroutines см stackoverflow.com/questions/14694088 / ...
z11i
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.