dongtingxiao4697 2018-06-19 17:29
浏览 735

Zap记录器不在控制台上打印,而是在日志文件中打印

I have integrated Zap with my go application, we have logs getting printed in two log files and i am also using Lumberjack for log rotation. But i am trying to display the logs in console as well, but no luck for this case. Following is my code in logger.go

var (
    Logger *zap.Logger
    N2n    *zap.Logger
)

type WriteSyncer struct {
    io.Writer
}

func (ws WriteSyncer) Sync() error {
    return nil
}

func InitLogging(mode string) {
    var cfg zap.Config
    var logName = "abc.log"
    var slogName = "n2n.log"

    if mode == "production" {
        cfg = zap.NewProductionConfig()
        cfg.DisableCaller = true
    } else {
        cfg = zap.NewDevelopmentConfig()
        cfg.EncoderConfig.LevelKey = "level"
        cfg.EncoderConfig.NameKey = "name"
        cfg.EncoderConfig.MessageKey = "msg"
        cfg.EncoderConfig.CallerKey = "caller"
        cfg.EncoderConfig.StacktraceKey = "stacktrace"
    }

    cfg.Encoding = "json"
    cfg.EncoderConfig.TimeKey = "timestamp"
    cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
    cfg.OutputPaths = []string{logName}
    sw := getWriteSyncer(logName)
    swSugar := getWriteSyncer(slogName)

    l, err := cfg.Build(SetOutput(sw, cfg))
    if err != nil {
        panic(err)
    }
    defer l.Sync()

    ls, err := cfg.Build(SetOutput(swSugar, cfg))
    if err != nil {
        panic(err)
    }
    defer ls.Sync()

    Logger = l
    N2n = ls
}

// SetOutput replaces existing Core with new, that writes to passed WriteSyncer.
func SetOutput(ws zapcore.WriteSyncer, conf zap.Config) zap.Option {
    var enc zapcore.Encoder
    switch conf.Encoding {
    case "json":
        enc = zapcore.NewJSONEncoder(conf.EncoderConfig)
    case "console":
        enc = zapcore.NewConsoleEncoder(conf.EncoderConfig)
    default:
        panic("unknown encoding")
    }

    return zap.WrapCore(func(core zapcore.Core) zapcore.Core {
        return zapcore.NewCore(enc, ws, conf.Level)
    })
}

func getWriteSyncer(logName string) zapcore.WriteSyncer {
    var ioWriter = &lumberjack.Logger{
        Filename:   logName,
        MaxSize:    10, // MB
        MaxBackups: 3,  // number of backups
        MaxAge:     28, //days
        LocalTime:  true,
        Compress:   false, // disabled by default
    }
    var sw = WriteSyncer{
        ioWriter,
    }
    return sw
}

I have tried appending the output paths but it is not working.

  • 写回答

2条回答 默认 最新

  • dsgw3315 2018-06-19 20:20
    关注

    Figured out that zapcore has NewMultiWriteSyncer which can write the logs in file and also on console using zapcore.addSync(os.stdout). For ex:

    swSugar := zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), 
               getWriteSyncer(logfileName))
    
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!