发现了一个 Go 最小化日志系统的好轮子
warning:
这篇文章距离上次修改已过205天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/mattn/go-isatty"
"github.com/sirupsen/logrus"
"os"
)
// 定义日志输出格式
type customFormatter struct{}
func (f *customFormatter) Format(entry *logrus.Entry) ([]byte, error) {
var msg string
if isatty.IsTerminal(os.Stdout.Fd()) {
msg = fmt.Sprintf("\033[36m%s\033[m %-44s: %s\n", entry.Time.Format("2006-01-02 15:04:05"), entry.Level, entry.Message)
} else {
msg = fmt.Sprintf("%s %-44s: %s\n", entry.Time.Format("2006-01-02 15:04:05"), entry.Level, entry.Message)
}
return []byte(msg), nil
}
func main() {
// 设置 Gin 的运行模式
gin.SetMode(gin.ReleaseMode)
// 创建一个 Gin 路由器
r := gin.New()
// 为 Gin 的日志中间件设置日志格式
log := logrus.New()
log.SetFormatter(new(customFormatter))
log.SetOutput(os.Stdout)
log.SetLevel(logrus.DebugLevel)
r.Use(GinLogger(log), GinRecovery(log))
// 创建一个基本的 GET 路由
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello, world!")
})
// 启动服务器
_ = r.Run(":8080")
}
// GinLogger 返回一个 Gin 日志中间件,使用指定的 Logger 进行日志记录
func GinLogger(logger *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
// 请求开始时间
startTime := time.Now()
// 请求结束时,调用该函数
c.Next()
// 计算请求响应时间
endTime := time.Now()
latencyTime := endTime.Sub(startTime)
// 获取请求相关参数
clientIP := c.ClientIP()
method := c.Request.Method
statusCode := c.Writer.Status()
requestURI := c.Request.RequestURI
referer := c.Request.Referer()
dataSize := c.Writer.Size()
if dataSize < 0 {
dataSize = 0
}
// 使用自定义的 Logger 记录日志
entry := logger.WithFields(logrus.Fields{
"statusCode": statusCode,
"latency": latencyTime.Seconds(),
"clientIP": clientIP,
"method": method,
"requestURI": requestURI,
"referer": referer,
"dataSize": dataSize,
})
if statusCode >= 400 {
entry.Error("HTTP Request Error")
} else {
entry.Info("HTTP Request Info")
}
}
}
// GinRecovery 返回一个 Gin 恢复中间件,使用指定的 Logger 来记录错误信息
func GinRecovery(logger *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if err := recover(); err !=
评论已关闭