[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))
}

posted on   进击的davis  阅读(467)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示