gin自定义日志

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

1、日志没输出到文件
2、日志不分割

通过自定义日志

用自己写的yanglog库基于zap的高性能日志库,轻松实现(自定义配置也极其轻松):
1、日志默认输出到终端,并写到文件
2、按天轮转,超过单文件大小也轮转
3、旧的日志文件,自动压缩,更旧的文件自动删除
4、状态码400以下的写到info日志文件中,状态码大于等于400的同时写到info和error日志文件中
5、该日志方案除了可以写客户请求时的日志,也可以直接应用到内部函数调用时的日志输出

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

直接上代码
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)
		}
	}
}

相关推荐

  1. gin定义

    2023-12-10 09:16:02       70 阅读
  2. linux 定时清空log

    2023-12-10 09:16:02       64 阅读
  3. linux定时删除历史

    2023-12-10 09:16:02       34 阅读
  4. Git 定义命令

    2023-12-10 09:16:02       29 阅读
  5. gin定义中间件

    2023-12-10 09:16:02       29 阅读
  6. 去除GIT某个时间之前的提交

    2023-12-10 09:16:02       52 阅读
  7. [运维|shell] 编写shell脚本定期清理

    2023-12-10 09:16:02       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-10 09:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-10 09:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-10 09:16:02       82 阅读
  4. Python语言-面向对象

    2023-12-10 09:16:02       91 阅读

热门阅读

  1. AlexNet

    AlexNet

    2023-12-10 09:16:02      65 阅读
  2. GitHub为Rust语言添加了供应链安全工具

    2023-12-10 09:16:02       63 阅读
  3. 用Go写一个缓存工具

    2023-12-10 09:16:02       63 阅读
  4. 本地部署 Qwen-Audio-Chat

    2023-12-10 09:16:02       63 阅读
  5. YOLOX 学习笔记

    2023-12-10 09:16:02       51 阅读
  6. Django模板

    2023-12-10 09:16:02       52 阅读
  7. Django模型

    2023-12-10 09:16:02       51 阅读
  8. properties配置和读取

    2023-12-10 09:16:02       42 阅读
  9. React和Preact 这样处理className更优雅

    2023-12-10 09:16:02       62 阅读
  10. wordpress小记

    2023-12-10 09:16:02       53 阅读
  11. spring 单元测试 Junit

    2023-12-10 09:16:02       54 阅读
  12. Spring Boot与Redis的整合

    2023-12-10 09:16:02       46 阅读
  13. d8week17

    d8week17

    2023-12-10 09:16:02      66 阅读