如何使golang的Logrus通过多个文件共享相同的配置?

时间:2018-10-02 02:15:17

标签: go

普通的演示代码在集成Logrus的配置和main的逻辑时起作用,如下所示

func main() {
    var filename string = "logfile.log"
    f, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
    Formatter := new(log.TextFormatter)
    Formatter.TimestampFormat = "02-01-2006 15:04:05"
    Formatter.FullTimestamp = true
    log.SetFormatter(Formatter)
    if err != nil {
        fmt.Println(err)
    } else {
        log.SetOutput(f)
    }

    log.Info("Some info. Earth is not flat")
    log.Warning("This is a warning")
    log.Error("Not fatal. An error. Won't stop execution")
}

但是在现实世界中,应该将logrus的配置分离为单个文件,将文件结构视为:

logrusdemo/
├── main.go
└── mylib
    ├── aa.go
    └── bb.go

我想在这些文件中共享相同的配置:

aa.go的源代码:

package mylib

// GetTestA testing
func GetTestA() string {
    //log.info("entering aa.go")
    return "001"
}

bb.go的源代码:

package mylib

// GetTestB testing
func GetTestB() string {
    //log.info("entering bb.go")
    return "001"
}

main.go的源代码:

package main

import (
    "fmt"
    "logrusdemo/mylib"
)

func main() {
    //log.info("entering main")
    fmt.Printf("%v", mylib.GetTestA())
    fmt.Printf("%v", mylib.GetTestB())
}

我想知道在这种情况下如何使logrus工作?

1 个答案:

答案 0 :(得分:2)

您可以通过将记录器传递到结构/函数来实现。

package main

import (
    "fmt"
    "github.com/sirupsen/logrus"
    "logrusdemo/mylib"
)

func main() {
    log = logrus.New()

    var filename string = "logfile.log"
    f, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)

    Formatter := new(log.TextFormatter)
    Formatter.TimestampFormat = "02-01-2006 15:04:05"
    Formatter.FullTimestamp = true
    log.SetFormatter(Formatter)
    if err != nil {
        fmt.Println(err)
    } else {
        log.SetOutput(f)
    }

    log.Info("Some info. Earth is not flat")
    log.Warning("This is a warning")
    log.Error("Not fatal. An error. Won't stop execution")

    fmt.Printf("%v", mylib.GetTestA(log))
    fmt.Printf("%v", mylib.GetTestB(log))
}

package mylib

import (
    "github.com/sirupsen/logrus"
)

// GetTestA testing
func GetTestA(log *logrus.Logger) string {
    log.Info("entering aa.go")
    return "001"
}

如果您不想将其作为参数传递,也可以在上下文中传递记录器,或将其用作全局变量。