14-Gin日志.md
一 Gin将日志写入控制台和文件中
方式一:直接配置方式
package main
import (
"github.com/gin-gonic/gin"
"io"
"os"
)
func main() {
//1 禁用控制台颜色
gin.DisableConsoleColor()
//2 创建记录日志的文件
f, _ := os.OpenFile("./app.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
// 写入到文件和控制台
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
//3 线上模式,控制台不会打印信息
//gin.DefaultWriter = f
//gin.SetMode(gin.ReleaseMode)
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(200, "index")
})
router.Run(":8080")
}
方式二:中间件方式
package main
import (
"github.com/gin-gonic/gin"
"io"
"os"
)
func main() {
router := gin.New()
f, _ := os.OpenFile("./aa.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
router.Use(gin.LoggerWithWriter(io.MultiWriter(f,os.Stdout)))
router.Use(gin.Recovery())
router.GET("/", func(c *gin.Context) {
c.String(200, "index")
})
router.Run(":8080")
}
二 Gin日志格式定制
通过gin.LoggerWithFormatter(formatter)中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.New()
// LoggerWithFormatter 中间件会将日志写入 gin.DefaultWriter,也就是os.Stdout
//gin.LoggerWithFormatter中间件,需要传入LogFormatter变量,是一个函数func(params LogFormatterParams) string类型
var formatter = func(param gin.LogFormatterParams) string {
return fmt.Sprintf("客户端IP:%s,请求时间:[%s],请求方式:%s,请求地址:%s,http协议版本:%s,请求状态码:%d,响应时间:%s,客户端:%s,错误信息:%s\n",
param.ClientIP,
param.TimeStamp.Format("2006年01月02日 15:03:04"),
param.Method,
param.Path,
param.Request.Proto,
param.StatusCode,
param.Latency,
param.Request.UserAgent(),
param.ErrorMessage,
)
}
router.Use(gin.LoggerWithFormatter(formatter))
router.Use(gin.Recovery())
router.GET("/", func(c *gin.Context) {
c.String(200, "index")
})
router.Run(":8080")
}
通过gin.LoggerWithConfig(conf)中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"io"
"os"
)
func main() {
router := gin.New()
// 使用LoggerWithConfig中间件,传入LoggerConfig结构体,有Formatter参数:是一个函数,Output参数:是输出位置
f, _ := os.OpenFile("gin.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
var conf = gin.LoggerConfig{
Formatter: func(param gin.LogFormatterParams) string {
return fmt.Sprintf("客户端IP:%s,请求时间:[%s],请求方式:%s,请求地址:%s,http协议版本:%s,请求状态码:%d,响应时间:%s,客户端:%s,错误信息:%s\n",
param.ClientIP,
param.TimeStamp.Format("2006年01月02日 15:03:04"),
param.Method,
param.Path,
param.Request.Proto,
param.StatusCode,
param.Latency,
param.Request.UserAgent(),
param.ErrorMessage,
)
},
Output: io.MultiWriter(os.Stdout, f),
}
router.Use(gin.LoggerWithConfig(conf))
router.Use(gin.Recovery())
router.GET("/", func(c *gin.Context) {
c.String(200, "index")
})
router.Run(":8080")
}
作者:liuqingzheng
出处:https://www.cnblogs.com/liuqingzheng/p/16244540.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2021-05-07 内网穿透方案大全
2018-05-07 Pycharm常用快捷键,以及设置