2019-09-01 10:03


  • inheritance
  • logging

I'm trying to migrate my application from the beautiful Logrus (very helpful for debug) and introducing the Uber log framework Zap.

With Logrus, i can initialize the logger only once and reuse it from other Go file, an example:

package main
    // Print filename on log
    filename ""
    // Very nice log library
    log ""

func main(){

    Formatter := new(log.TextFormatter) //#TODO: Formatter have to be inserted in `configuration` in order to dynamically change debug level [at runtime?]
    Formatter.TimestampFormat = "15-01-2018 15:04:05.000000"
    Formatter.FullTimestamp = true
    Formatter.ForceColors = true
    log.AddHook(filename.NewHook()) // Print filename + line at every log


From other Go file, i'm able to reuse that logger without any other initialization:

// VerifyCommandLineInput is delegated to manage the inputer parameter provide with the input flag from command line
func VerifyCommandLineInput() datastructures.Configuration {
    log.Debug("VerifyCommandLineInput | Init a new configuration from the conf file")
    c := flag.String("config", "./conf/test.json", "Specify the configuration file.")
    if strings.Compare(*c, "") == 0 {
        log.Fatal("VerifyCommandLineInput | Call the tool using --config conf/config.json")
    file, err := os.Open(*c)
    if err != nil {
        log.Fatal("VerifyCommandLineInput | can't open config file: ", err)
    defer file.Close()
    decoder := json.NewDecoder(file)
    cfg := datastructures.Configuration{}
    err = decoder.Decode(&cfg)
    if err != nil {
        log.Fatal("VerifyCommandLineInput | can't decode config JSON: ", err)
    log.Debug("VerifyCommandLineInput | Conf loaded -> ", cfg)

    return cfg

My question is:
Using the Zap log framework, how can i initialize the log in the main function and use that logger from the other Go file?


Initialize a new log and set as global as pointed by @Mikhail.

package main


func initZapLog() *zap.Logger {
    config := zap.NewDevelopmentConfig()
    config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
    config.EncoderConfig.TimeKey = "timestamp"
    config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
    logger, _ := config.Build()
    return logger

func main() {

    loggerMgr := initZapLog()
    defer loggerMgr.Sync() // flushes buffer, if any
    logger := loggerMgr.Sugar()
    db2.GetToken(`alessio`, `savi`, `pass`)

Than you can use the logger in the other Go file:

func GetToken(url, user, pass string) string {
    var User datastructure.User
    var data string
    var jsonData []byte

    User.User = user
    User.Pass = pass
    jsonData, err := json.Marshal(User)
    if err != nil {
        zap.S().Errorw("Error during marshalling...", err)
        return ""
    data = string(jsonData)
    zap.S().Info("Data encoded => ", data)
    return ""
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答


  • douliang1900 douliang1900 2年前

    You can set up your logger in the main function and call to use it as a default global logger.

    点赞 评论 复制链接分享