zdpgo_gin_zap 整合zdpgo_gin框架和zdpgo_zap框架的日志中间件,用于实现路由日志记录
zdpgo_gin_zap
整合zdpgo_gin框架和zdpgo_zap框架的日志中间件,用于实现路由日志记录
安装
go get github.com/zhangdapeng520/zdpgo_gin_zap
使用教程
基本用法
package mainimport ("fmt""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap"
)func main() {r := gin.New()// 创建日志logger, _ := zap.NewProduction()// 添加日志中间件r.Use(ginzap.Ginzap(logger, time.DateTime, true))// 添加捕获中间件r.Use(ginzap.RecoveryWithZap(logger, true))// 普通的示例r.GET("/ping", func(c *gin.Context) {c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// 异常示例r.GET("/panic", func(c *gin.Context) {panic("An unexpected error happen!")})// 启动服务if err := r.Run(":8080"); err != nil {panic(err)}
}
使用自定义的配置
package mainimport ("bytes""fmt""io""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap""github.com/zhangdapeng520/zdpgo_zap/zapcore"
)func main() {r := gin.New()logger, _ := zap.NewProduction()// 使用详细的配置r.Use(ginzap.GinzapWithConfig(logger, &ginzap.Config{UTC: true,TimeFormat: time.RFC3339,Context: ginzap.Fn(func(c *gin.Context) []zapcore.Field {fields := []zapcore.Field{}// 记录请求IDif requestID := c.Writer.Header().Get("X-Request-Id"); requestID != "" {fields = append(fields, zap.String("request_id", requestID))}// 记录链路追踪ID//if trace.SpanFromContext(c.Request.Context()).SpanContext().IsValid() {// fields = append(fields, zap.String("trace_id", trace.SpanFromContext(c.Request.Context()).SpanContext().TraceID().String()))// fields = append(fields, zap.String("span_id", trace.SpanFromContext(c.Request.Context()).SpanContext().SpanID().String()))//}// 记录请求体信息var body []bytevar buf bytes.Buffertee := io.TeeReader(c.Request.Body, &buf)body, _ = io.ReadAll(tee)c.Request.Body = io.NopCloser(&buf)fields = append(fields, zap.String("body", string(body)))return fields}),}))// Example ping request.r.GET("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "1234-5678-9012")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})r.POST("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "9012-5678-1234")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// Listen and Server in 0.0.0.0:8080if err := r.Run(":8080"); err != nil {panic(err)}
}
指定路径不记录日志
package mainimport ("fmt""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap"
)func main() {r := gin.New()logger, _ := zap.NewProduction()r.Use(ginzap.GinzapWithConfig(logger, &ginzap.Config{UTC: true,TimeFormat: time.RFC3339,Skipper: func(c *gin.Context) bool {return c.Request.URL.Path == "/ping" && c.Request.Method == "GET"},}))// Example ping request.r.GET("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "1234-5678-9012")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})r.POST("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "9012-5678-1234")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// Listen and Server in 0.0.0.0:8080if err := r.Run(":8080"); err != nil {panic(err)}
}
指定正则匹配路径不记录日志
package mainimport ("fmt""regexp""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap"
)func main() {r := gin.New()logger, _ := zap.NewProduction()rxURL := regexp.MustCompile(`^/ping\s*`)r.Use(ginzap.GinzapWithConfig(logger, &ginzap.Config{UTC: true,TimeFormat: time.RFC3339,SkipPathRegexps: []*regexp.Regexp{rxURL},}))// Example ping request.r.GET("/ping1234", func(c *gin.Context) {c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// Listen and Server in 0.0.0.0:8080if err := r.Run(":8080"); err != nil {panic(err)}
}
版本
v0.1.0
- 初始代码