- Создать единый log.Logger и передать его?
Это возможно. Log.Logger может использоваться одновременно из нескольких goroutines.
- Передать указатель на этот журнал.
log.New возвращает a, *Logger
который обычно указывает на то, что вы должны передать объект как указатель. Передача его в качестве значения создаст копию структуры (т.е. копию Logger), а затем несколько горутин могут одновременно писать в один и тот же io.Writer . Это может быть серьезной проблемой, в зависимости от реализации писателя.
- Должна ли каждая горутина или функция создавать регистратор?
Я бы не стал создавать отдельный логгер для каждой функции или горутины. Горутины (и функции) используются для очень легких задач, которые не оправдывают обслуживание отдельного регистратора. Вероятно, будет хорошей идеей создать регистратор для каждого более крупного компонента вашего проекта. Например, если ваш проект использует службу SMTP для отправки писем, создание отдельного регистратора для почтовой службы кажется хорошей идеей, так что вы можете фильтровать и отключать вывод отдельно.
- Должен ли я создавать регистратор как глобальную переменную?
Это зависит от вашего пакета. В предыдущем примере почтовой службы, вероятно, было бы хорошей идеей иметь по одному регистратору для каждого экземпляра вашей службы, чтобы пользователи могли регистрировать сбои при использовании почтовой службы gmail иначе, чем сбои, которые произошли при использовании локального MTA (например, sendmail ).
io.Writer
интерфейс, и вы изменяете вывод регистратора по умолчанию черезSetOutput()
.Это простой регистратор
Вы можете использовать это таким образом
источник
Я знаю, что этот вопрос немного устарел, но если, как и я, ваши проекты состоят из нескольких файлов меньшего размера, я голосую за ваш 4-й вариант - я создал его,
logger.go
который является частью пакета main. Этот файл go создает регистратор, назначает его файлу и предоставляет его остальной части main. Обратите внимание: я не придумал изящного способа закрыть журнал ошибок ...источник
defer errorlog.Close()
в конце выполнения или, чтобы лучше гарантировать его закрытие, настроить обработчики сигналов с помощью пакета сигналов Go golang.org/pkg/os/signalЭто старый вопрос, но я хотел бы предложить использовать http://github.com/romana/rlog (который мы разработали). Он настраивается с помощью переменных среды, объект регистратора создается и инициализируется при импорте rlog. Следовательно, нет необходимости передавать регистратор.
rlog имеет несколько функций:
Он очень маленький, не имеет внешних зависимостей, кроме стандартной библиотеки Golang и активно развивается. Примеры представлены в репо.
источник
Я обнаружил, что пакет журнала по умолчанию ( https://golang.org/pkg/log/ ) несколько ограничивает. Например, нет поддержки журналов информации и отладки.
После некоторых поисков остановился на https://github.com/golang/glog . Это похоже на порт https://github.com/google/glog и дает приличную гибкость при ведении журнала. Например, при локальном запуске приложения вам может потребоваться журнал уровня DEBUG, но вы можете захотеть запустить только на уровне INFO / ERROR в производстве. Список полных функций / руководство находится здесь https://google-glog.googlecode.com/svn/trunk/doc/glog.html (это для модуля c ++, но по большей части переводится на порт golang)
источник
Один из модулей ведения журнала, который вы можете рассмотреть, - это klog . Он поддерживает ведение журнала V, что дает гибкость для ведения журнала на определенном уровне
klog является форком glog и преодолевает следующие недостатки
Пример реализации
источник