Ответ 1
Вам не нужно устанавливать эти параметры в каждом файле с помощью Logrus.
Вы можете импортировать Logrus как log
:
import log "github.com/Sirupsen/logrus"
Затем такие функции, как log.SetOutput()
, являются просто функциями и изменяют глобальный регистратор и применяются к любому файлу, который включает этот импорт.
Вы можете создать глобальную переменную log
пакета:
var log = logrus.New()
Тогда функции типа log.SetOutput()
являются методами и изменяют ваш пакет глобальным. Это неудобно ИМО, если в вашей программе есть несколько пакетов, потому что у каждого из них есть другой регистратор с разными настройками (но, возможно, это хорошо для некоторых случаев использования). Мне тоже не нравится этот подход, потому что он смущает goimports
(который захочет вставить log
в ваш список импорта).
Или вы можете создать свою собственную оболочку (что я и делаю). У меня есть собственный log
пакет со своим logger
var:
var logger = logrus.New()
Затем я делаю функции верхнего уровня для переноса Logrus:
func Info(args ...interface{}) {
logger.Info(args...)
}
func Debug(args ...interface{}) {
logger.Debug(args...)
}
Это немного утомительно, но позволяет добавлять функции, специфичные для моей программы:
func WithConn(conn net.Conn) *logrus.Entry {
var addr string = "unknown"
if conn != nil {
addr = conn.RemoteAddr().String()
}
return logger.WithField("addr", addr)
}
func WithRequest(req *http.Request) *logrus.Entry {
return logger.WithFields(RequestFields(req))
}
Итак, я могу делать такие вещи, как:
log.WithConn(c).Info("Connected")
(Я планирую в будущем обернуть logrus.Entry
в свой собственный тип, чтобы я мог лучше их связать; в настоящее время я не могу вызвать log.WithConn(c).WithRequest(r).Error(...)
, потому что я не могу добавить WithRequest()
в logrus.Entry
.)