Files

88 lines
2.4 KiB
Go
Raw Permalink Normal View History

2026-04-20 13:52:50 +08:00
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)),
// )
}