我正在使用logrus库在Go项目中进行结构化日志记录。
我已将我的日志配置如下:
// Global variable for logging
var gLog = &Logger{moduleName: ModuleName, logrus: logrus.New()}
type Logger struct {
moduleName string
logrus *logrus.Logger
}
func SetupGlobalLogger(logPrefix string, logMode string) error {
if logMode == "file" {
logFilePath := fmt.Sprintf("var/%s.log", vite.Environment())
file, err := os.OpenFile(logFilePath, logFileFlags, logFilePermission)
if err != nil {
return err
}
gLog.logrus.SetOutput(file)
// redirect logs written using standard log library to same place as logrus
log.SetOutput(gLog.logrus.Writer())
log.Println(vite.MarkInfo, "redirect log to file:", logFilePath)
}
return nil
}
在这个Go项目中,在很多地方都使用了诸如
log.Println()
之类的标准日志库语句。我想将那些日志消息重定向到logrus。
为此,我在上面的代码中使用以下语句。
log.SetOutput(gLog.logrus.Writer())
我的问题是:此线程安全吗?
如果一个线程/例程在执行log.Println()而另一个在执行gLog.logrus.Info()或logrus上的某个例程,那可以吗?
最佳答案
Logrus线程安全吗?
Yes:
除了when it isn't。
大多数非线程安全的情况都是仅在极少数情况下才会发生的错误。当然,它们对您而言是否重要都取决于您的用例。