- Создайте единый log.Logger и передайте его вокруг?
Это возможно. A log.Logger может использоваться одновременно с несколькими гортанами.
- Pass вокруг указателя на этот log.Logger?
log.New возвращает *Logger
, который, как правило, признак того, что вы должны передать объект вокруг как указатель. Передавая его как значение, создается копия структуры (т. Е. Копия Logger), а затем несколько goroutines могут одновременно записывать на тот же io.Writer. Это может быть серьезной проблемой, в зависимости от реализации писателя.
- Если каждый goroutine или функция создания регистратора?
Я не создавал отдельный регистратор для каждой функции или goroutine. Горутины (и функции) используются для очень легких задач, которые не будут оправдывать обслуживание отдельного регистратора. Вероятно, это хорошая идея создать регистратор для каждого более крупного компонента вашего проекта. Например, если в вашем проекте используется служба SMTP для отправки писем, создание отдельного регистратора для почтовой службы звучит как хорошая идея, так что вы можете фильтровать и отключать вывод отдельно.
- Должен ли я создать регистратор как глобальную переменную?
Это зависит от вашей упаковки. В предыдущем примере почтовой службы было бы неплохо иметь один регистратор для каждого экземпляра вашей службы, чтобы пользователи могли регистрировать сбои при использовании почтовой службы gmail иначе, чем сбои, возникающие при использовании локальной MTA (например, sendmail).
Ваш ответ был в значительной степени ясен, спасибо – deFreitas