我在一个Go应用程序中使用logrus。我相信这个问题也适用于任何其他日志包(它不提供基于外部文件的配置)。
logrus提供了设置各种配置的功能,例如SetOutput、SetLevel等。
像任何其他应用程序一样,我需要从多个源文件/包进行日志记录,似乎您需要使用logrus在每个文件中设置这些选项。
有没有办法将这些选项设置在一个中心位置,以便在整个应用程序中共享。这样,如果我必须更改日志级别,我可以在一个地方进行更改,并将其应用于应用程序的所有组件。
发布于 2015-05-15 21:55:02
您不需要使用Logrus在每个文件中设置这些选项。
您可以将Logrus作为log导入
import log "github.com/Sirupsen/logrus"然后,像log.SetOutput()这样的函数就是修改全局记录器的函数,并应用于包含此导入的任何文件。
您可以创建包全局log变量:
var log = logrus.New()然后像log.SetOutput()这样的函数就是全局修改包的方法。如果你的程序中有多个包,这是很尴尬的,因为每个包都有不同的记录器和不同的设置(但这对于某些用例可能是好的)。我也不喜欢这种方法,因为它混淆了goimports (它想要将log插入到您的导入列表中)。
或者,您可以创建自己的包装器(这就是我所做的)。我有自己的带有自己的logger变量的log包:
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中。)
发布于 2017-10-25 07:23:43
这是我为我的应用程序设计的解决方案,它允许向日志上下文中添加字段。由于上下文基础字段的复制,它确实具有很小的性能影响。
package logging
import (
log "github.com/Sirupsen/logrus"
)
func NewContextLogger(c log.Fields) func(f log.Fields) *log.Entry {
return func(f log.Fields) *log.Entry {
for k, v := range c {
f[k] = v
}
return log.WithFields(f)
}
}
package main
import (
"logging"
)
func main {
app.Logger = logging.NewContextLogger(log.Fields{
"module": "app",
"id": event.Id,
})
app.Logger(log.Fields{
"startTime": event.StartTime,
"endTime": event.EndTime,
"title": event.Name,
}).Info("Starting process")
}https://stackoverflow.com/questions/30257622
复制相似问题