88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
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)),
|
|
// )
|
|
}
|