package main import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) func main() { // 创建 lumberjack 文件轮转器 fileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ Filename: "zap.log", MaxSize: 1, // MB MaxBackups: 3, // 最多保留3个备份 MaxAge: 30, // 最大保存天数 Compress: true, // 是否压缩 }) // 创建多个输出目标 consoleSyncer := zapcore.Lock(os.Stdout) fileSyncer := zapcore.Lock(fileWriteSyncer) // 配置编码器 encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", FunctionKey: zapcore.OmitKey, MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalColorLevelEncoder, // 控制台带颜色 EncodeTime: zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000"), EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } // 文件编码器(无颜色) fileEncoderConfig := encoderConfig fileEncoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder // 文件不要颜色 // 创建多个 core consoleCore := zapcore.NewCore( zapcore.NewConsoleEncoder(encoderConfig), // 控制台用 ConsoleEncoder consoleSyncer, zap.InfoLevel, ) fileCore := zapcore.NewCore( zapcore.NewConsoleEncoder(fileEncoderConfig), // 文件也用 ConsoleEncoder,但无颜色 fileSyncer, zap.InfoLevel, ) // 使用 tee 将日志同时输出到控制台和文件 core := zapcore.NewTee(consoleCore, fileCore) // 创建 logger logger := zap.New(core, zap.AddCaller()) defer logger.Sync() // 程序退出时刷新缓冲区 logger.Info("水电费水电费。") sugar := logger.Sugar() // 记录日志 sugar.Info("This is an info message") sugar.Warn("This is a warning message") sugar.Error("This is an error message") // 测试带字段的日志 sugar.With( zap.String("component", "auth"), zap.Int("user_id", 12345), zap.String("ip", "192.168.1.100"), ).Info("User login success") // 如果需要更结构化的日志,可以使用非 sugar 版本(性能更高) // logger.Info("Structured logging example", // zap.String("component", "api"), // zap.Int("status", 200), // zap.Duration("duration", zap.Duration("latency", 150)), // ) }