package log import ( "context" "fmt" "go.uber.org/zap" "go.uber.org/zap/zapcore" lumberjack "gopkg.in/natefinch/lumberjack.v2" "interview-one-stop-server/util" "net/url" ) var log *zap.Logger type lumberjackSink struct { *lumberjack.Logger } func (l lumberjackSink) Sync() error { return nil } func GetLogger() *zap.Logger { return log } func newLogger(logLevel string, logFolder string, dev bool) (*zap.Logger, error) { var level zapcore.Level switch logLevel { case "debug": level = zap.DebugLevel case "info": level = zap.InfoLevel case "warning": level = zap.WarnLevel case "error": level = zap.ErrorLevel default: return nil, fmt.Errorf("unknown log level %s", logLevel) } encoderConfig := zapcore.EncoderConfig{ TimeKey: "ts", LevelKey: "level", NameKey: "logger", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalLevelEncoder, EncodeTime: zapcore.RFC3339TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, ConsoleSeparator: " ", } ll := lumberjack.Logger{ Filename: logFolder, MaxSize: 100, // MB MaxBackups: 31, MaxAge: 31, // days Compress: false, } _ = zap.RegisterSink("lumberjack", func(*url.URL) (zap.Sink, error) { return lumberjackSink{ Logger: &ll, }, nil }) loggerConfig := zap.Config{ Level: zap.NewAtomicLevelAt(level), Development: dev, Encoding: "console", EncoderConfig: encoderConfig, OutputPaths: []string{"stderr", fmt.Sprintf("lumberjack:%s", logFolder)}, } logger, err := loggerConfig.Build() if err != nil { panic(fmt.Sprintf("build zap logger from config error: %v", err)) } return logger, nil } func init() { log, _ = newLogger("info", "logs/app.log", false) } func Error(ctx context.Context, label string, msg string) { log.Sugar().Error(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg) } func Warn(ctx context.Context, label string, msg string) { log.Sugar().Warnf(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg) } func Info(ctx context.Context, label string, msg string) { log.Sugar().Info(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg) } func Debug(ctx context.Context, label string, msg string) { log.Sugar().Debug(getTraceIDFromContext(ctx) + " label=" + label + ",msg=" + msg) } func getTraceIDFromContext(ctx context.Context) string { traceID := ctx.Value("trace_id") if traceID == nil { return util.GenUUID() } return traceID.(string) }