Go Gin框架登录JSON



我正在使用Go Gin设置一个小型API,但我无法说服记录器输出JSON。默认情况下,它是一个键/值字符串,但我需要它作为json。

我怎样才能做到这一点?我觉得它应该很容易得到支持,但我一直在为自定义格式化功能而挣扎,我需要自己考虑各种参数。

或者,我也使用uber/zap记录器手动登录,但我还没有找到用我的记录器取代杜松子酒记录器的方法。

任何建议都将不胜感激,因为杜松子酒github上的文档并没有太大帮助。

谢谢!

编辑:为了澄清,添加中间件有助于记录请求,但我正在寻找为Gin设置JSON日志记录的单点(例如:包括与请求无关的日志,如框架内部的调试/信息日志(

访问记录器

https://github.com/sbecker/gin-api-demo/blob/master/middleware/json_logger.go


// JSONLogMiddleware logs a gin HTTP request in JSON format, with some additional custom key/values
func JSONLogMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// Start timer
start := time.Now()
// Process Request
c.Next()
// Stop timer
duration := util.GetDurationInMillseconds(start)
entry := log.WithFields(log.Fields{
"client_ip":  util.GetClientIP(c),
"duration":   duration,
"method":     c.Request.Method,
"path":       c.Request.RequestURI,
"status":     c.Writer.Status(),
"user_id":    util.GetUserID(c),
"referrer":   c.Request.Referer(),
"request_id": c.Writer.Header().Get("Request-Id"),
// "api_version": util.ApiVersion,
})
if c.Writer.Status() >= 500 {
entry.Error(c.Errors.String())
} else {
entry.Info("")
}
}
}

调试记录器

查看gin源代码,发现调试日志输出到io.Writer。重写此对象会将输出重定向到json,类似于处理http输出的方法。服务器错误日志。

func debugPrint(format string, values ...interface{}) {
if IsDebugging() {
if !strings.HasSuffix(format, "n") {
format += "n"
}
fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...)
}
}

设置调试写入,此代码不进行测试。

// WriteFunc convert func to io.Writer.
type WriteFunc func([]byte) (int, error)
func (fn WriteFunc) Write(data []byte) (int, error) {
return fn(data)
}
func NewLogrusWrite() io.Writer {
return WriteFunc(func(data []byte) (int, error) {
logrus.Debugf("%s", data)
return 0, nil
})
}
// set gin write to logrus debug.
gin.DefaultWriter = NewLogrusWrite()

获取所有http。服务器错误日志。

htt。服务器

htt。服务器将日志输出到日志。Logger,并创建日志。指定io.Writer输出的记录器,用于从http接收错误日志。Sever没有详细的写杜松子酒使用自定义Sever代码,请查看杜松子酒文档。

srv := &http.Server{
// log level is bebug, please create a error level io.Writer
ErrorLog: log.New(NewLogrusWrite(), "", 0),
} 

除了@audore的答案;他的方法将更改默认输出,默认输出为stdout。我们仍然想使用stdout,但如果我们想更改整个输出,我们应该执行以下步骤。

1-从更改轧棉机初始化

r := gin.Default()

r := gin.New()
r.Use(gin.Recovery()) // to recover gin automatically
r.Use(jsonLoggerMiddleware()) // we'll define it later

因为杜松子酒。Default((使用默认的Logger((中间件。如果我们继续使用它,杜松子酒将输出两倍

2-将中间件添加到您的应用程序

func jsonLoggerMiddleware() gin.HandlerFunc {
return gin.LoggerWithFormatter(
func(params gin.LogFormatterParams) string {
log := make(map[string]interface{})
log["status_code"] = params.StatusCode
log["path"] = params.Path
log["method"] = params.Method
log["start_time"] = params.TimeStamp.Format("2006/01/02 - 15:04:05")
log["remote_addr"] = params.ClientIP
log["response_time"] = params.Latency.String()
s, _ := json.Marshal(log)
return string(s) + "n"
},
)
}

你的输出将是:

{"method":"GET","path":"/v1/somepath","remote_addr":"::1","response_time":"5.719ms","start_time":"2022/10/03 - 17:26:11","status_code":200}

从Loki+Grafana 这样的日志侦听器中解析太容易了

适用于go>1.21我们有log/slog包,它有助于结构化日志

所以目前最好的杜松子酒选择是:samber/slog杜松子酒包

相关内容

  • 没有找到相关文章

最新更新