gin自定义日志

gin的默认日志是只输出到终端,缺点:

1、日志没输出到文件

2、日志不分割

通过自定义日志

用自己写的yanglog库基于zap的高性能日志库,轻松实现(自定义配置也极其轻松):

1、日志默认输出到终端,并写到文件

2、按天轮转,超过单文件大小也轮转

3、旧的日志文件,自动压缩,更旧的文件自动删除

4、状态码400以下的写到info日志文件中,状态码大于等于400的同时写到info和error日志文件中

5、该日志方案除了可以写客户请求时的日志,也可以直接应用到内部函数调用时的日志输出

yanglog 的使用和配置,源码都很简单,请按需使用和修改。

直接上代码
go 复制代码
package main

import (
	"context"
	"fmt"
	"time"

	logger "gitee.com/xiaoshanyangcode/yanglog"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

func main() {
	// 配置日志
	ctx, cancel := context.WithCancel(context.Background())
	logconf := logger.LogConf{}
	log := logger.NewLogger(ctx, logconf)
	defer log.Sync()
	defer cancel()

	// 生产gin对象
	r := Default(log)

	// 正常gin的用法
	r.GET("/ce", func(c *gin.Context) {
		// 取值
		req := "123"
		fmt.Println("request:", req)
		// 页面接收
		c.JSON(200, gin.H{"request": req})
	})

	r.Run()
}

// 提供gin的Default函数,把日志改为我们自定义的
func Default(log *zap.SugaredLogger) *gin.Engine {
	engine := gin.New()
	// 使用自己的日志模块和默认的recovery
	engine.Use(LoggerWithConfig(log), gin.Recovery())
	return engine
}

// 自定义日志函数
func LoggerWithConfig(log *zap.SugaredLogger) gin.HandlerFunc {
	return func(c *gin.Context) {
		// Start timer
		start := time.Now()
		path := c.Request.URL.Path
		raw := c.Request.URL.RawQuery

		// Process request
		c.Next()

		param := gin.LogFormatterParams{
			Request: c.Request,
			Keys:    c.Keys,
		}

		// Stop timer
		param.TimeStamp = time.Now()
		param.Latency = param.TimeStamp.Sub(start)

		param.ClientIP = c.ClientIP()
		param.Method = c.Request.Method
		param.StatusCode = c.Writer.Status()
		param.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()

		param.BodySize = c.Writer.Size()
		if raw != "" {
			path = path + "?" + raw
		}

		param.Path = path
		// 根据不同的状态码,设置不同的日志等级
		if param.StatusCode < 400 {
			log.Infow(param.ErrorMessage, "code", param.StatusCode, "client", param.ClientIP, "method", param.Method, "path", param.Path, "size", param.BodySize, "duration", param.Latency)
		} else {
			log.Errorw(param.ErrorMessage, "code", param.StatusCode, "client", param.ClientIP, "method", param.Method, "path", param.Path, "size", param.BodySize, "duration", param.Latency)
		}
	}
}
相关推荐
BlockChain8889 小时前
字符串最后一个单词的长度
算法·go
龙井茶Sky10 小时前
通过higress AI统计插件学gjson表达式的分享
go·gjson·higress插件
moxiaoran575310 小时前
Go语言的错误处理
开发语言·后端·golang
CTO Plus技术服务中20 小时前
一栈式、系统性的C、C++、Go、网络安全、Linux运维开发笔记和面试笔记
c++·web安全·golang
modelmd21 小时前
Go、Java 的值类型和引用类型对比
java·golang
资深web全栈开发21 小时前
高并发的本质:超越语言的协作哲学——以 Go HTTP 服务器为例
服务器·http·golang·系统设计·goroutine·高并发架构·go并发
bing.shao21 小时前
Golang 在OPC领域的应用
开发语言·后端·golang
os_lee21 小时前
Milvus 实战教程(Go 版本 + Ollama bge-m3 向量模型)
数据库·golang·milvus
源代码•宸1 天前
大厂技术岗面试之一面(准备自我介绍、反问)
经验分享·后端·算法·面试·职场和发展·golang·反问
宇宙帅猴1 天前
【Ubuntu踩坑及解决方案(一)】
linux·运维·ubuntu·go