3 changed files with 68 additions and 1 deletions
@ -0,0 +1,62 @@ |
|||
package util |
|||
|
|||
import ( |
|||
"os" |
|||
"time" |
|||
|
|||
"go.uber.org/zap" |
|||
"go.uber.org/zap/zapcore" |
|||
"gopkg.in/natefinch/lumberjack.v2" |
|||
) |
|||
|
|||
// 初始化生产级日志器
|
|||
func NewProductionLogger() *zap.Logger { |
|||
// 1. 配置日志轮转(用lumberjack)
|
|||
hook := &lumberjack.Logger{ |
|||
|
|||
Filename: "./logs/app.log", // 日志文件路径
|
|||
MaxSize: 100, // 单个文件最大大小(MB)
|
|||
MaxBackups: 7, // 最多保留多少个备份文件
|
|||
MaxAge: 7, // 日志文件最多保留多少天
|
|||
Compress: true, // 是否压缩备份文件(gzip)
|
|||
} |
|||
defer hook.Close() |
|||
|
|||
// 2. 设置日志输出格式
|
|||
// 时间格式:2024-05-20 09:30:00.123
|
|||
timeFormat := "2006-01-02 15:04:05.000" |
|||
encoderConfig := zapcore.EncoderConfig{ |
|||
TimeKey: "ts", |
|||
LevelKey: "level", |
|||
NameKey: "logger", |
|||
CallerKey: "caller", |
|||
MessageKey: "msg", |
|||
StacktraceKey: "stacktrace", |
|||
LineEnding: zapcore.DefaultLineEnding, |
|||
EncodeLevel: zapcore.CapitalLevelEncoder, // 级别用大写(INFO、ERROR)
|
|||
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { |
|||
enc.AppendString(t.Format(timeFormat)) |
|||
}, |
|||
EncodeDuration: zapcore.SecondsDurationEncoder, |
|||
EncodeCaller: zapcore.ShortCallerEncoder, // 调用者信息简化(main/main.go:20)
|
|||
} |
|||
|
|||
// 3. 配置日志级别和输出目标
|
|||
// 输出目标:同时打印到控制台和文件
|
|||
core := zapcore.NewCore( |
|||
zapcore.NewJSONEncoder(encoderConfig), // JSON格式
|
|||
zapcore.NewMultiWriteSyncer( |
|||
zapcore.AddSync(hook), // 写入文件
|
|||
zapcore.AddSync(zapcore.Lock(os.Stdout)), // 打印到控制台
|
|||
), |
|||
zapcore.InfoLevel, // 生产环境只打印Info及以上级别
|
|||
) |
|||
|
|||
// 4. 开启调用者信息和堆栈跟踪
|
|||
logger := zap.New(core, |
|||
zap.AddCaller(), // 显示日志调用的文件和行号
|
|||
zap.AddStacktrace(zapcore.ErrorLevel), // 只有Error及以上级别才显示堆栈
|
|||
) |
|||
|
|||
return logger |
|||
} |
|||
Loading…
Reference in new issue