[go-每日一库] go使用uber的zap库简单实现日志功能
代码结构:
. +--- go.mod +--- go.sum +--- logs | +--- zap.log +--- main.go +--- zlog | +--- log.go
见代码:
// https://mp.weixin.qq.com/s/Jh2iFY5uGe0qCFdKZWjotA package zlog import ( "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" "os" "path" "runtime" ) var logger *zap.Logger func init() { encoderConfig := zap.NewProductionEncoderConfig() // set time format encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // set log codec -> json encoder := zapcore.NewJSONEncoder(encoderConfig) file, _ := os.OpenFile("D:\\demo1\\src\\demo\\demo06\\zap-log\\logs\\zap.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 644) fileWriterSyncer := zapcore.AddSync(file) core := zapcore.NewTee( // output to console zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel), // output to file zapcore.NewCore(encoder, fileWriterSyncer, zapcore.DebugLevel), ) logger = zap.New(core) } // log rotate func getFileLogWriter() (writeSyncer zapcore.WriteSyncer) { // use lumberjack to rotate lumberJackLogger := &lumberjack.Logger{ Filename: "D:\\demo1\\src\\demo\\demo06\\zap-log\\logs\\zap.log", MaxSize: 10, // filesize, MB MaxBackups: 7, // >7, than rotate MaxAge: 1, // frequency, 1 day Compress: false, } return zapcore.AddSync(lumberJackLogger) } func Info(message string, fields ...zap.Field) { callerFields := getCallerInfoForLog() fields = append(fields, callerFields...) logger.Info(message, fields...) } func Debug(message string, fields ...zap.Field) { callerFields := getCallerInfoForLog() fields = append(fields, callerFields...) logger.Debug(message, fields...) } func Error(message string, fields ...zap.Field) { callerFields := getCallerInfoForLog() fields = append(fields, callerFields...) logger.Error(message, fields...) } func Warn(message string, fields ...zap.Field) { callerFields := getCallerInfoForLog() fields = append(fields, callerFields...) logger.Warn(message, fields...) } func getCallerInfoForLog() (callerFields []zap.Field) { pc, file, line, ok := runtime.Caller(2) // 回溯两层,拿到写日志的调用方的函数信息 if !ok { return } funcName := runtime.FuncForPC(pc).Name() funcName = path.Base(funcName) //Base函数返回路径的最后一个元素,只保留函数名 callerFields = append(callerFields, zap.String("func", funcName), zap.String("file", file), zap.Int("line", line)) return }
main.go
package main import ( "go.uber.org/zap" "zap-log/zlog" ) type user struct { Name string `json:"name"` } func main() { user := &user{ Name: "Kevin", } zlog.Info("test log", zap.Any("user", user)) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!