我正在使用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

大多数非线程安全的情况都是仅在极少数情况下才会发生的错误。当然,它们对您而言是否重要都取决于您的用例。

10-04 19:01