如何自定义Gin API应用程序的日志格式?
我试着用logrus包来做,但我的问题是:当我故意制造了404或400错误时,控制台中没有显示错误消息。
我还希望记录器在记录器中显示响应主体。
func requestLoggingMiddleware(logger *logrus.Logger) gin.HandlerFunc {
return func(c *gin.Context) {
// Read the request body
bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
bodyString := string(bodyBytes)
// Process request
c.Next()
// Log request details
// Include Request error message
logger.WithFields(logrus.Fields{
"status": c.Writer.Status(),
"method": c.Request.Method,
"path": c.Request.URL.Path,
"query_params": c.Request.URL.Query(),
"req_body": bodyString,
// "res_error_1": c.Errors.ByType(gin.ErrorTypePrivate).String(),
"res_error_2": c.Errors.String(),
}).Info("Request details")
}
}
func main() {
logrus.Info("Starting the application...")
// 1. Create a new instance of the application.
app := gin.New()
// OPTION 1
logger := logrus.New()
logger.SetLevel(logrus.InfoLevel)
app.Use(gin.LoggerWithWriter(logger.Writer()))
app.Use(requestLoggingMiddleware(logger))
...
}
字符串
以下是控制台上显示的内容:
INFO[0015] Request details body="{\"d\":\"D\"}" error= method=POST path=/ping query_params="map[]" status=404
型
1条答案
按热度按时间fcipmucu1#
正如@PRATHEESH PC所建议的,我根据你的需要整理了一个小例子。该代码分为三个部分:中间件、HTTP处理程序和主程序包。让我们从HTTP处理程序开始。
handlers/handlers.go
文件字符串
这里唯一要提到的是
ShouldBindBodyWith
方法的使用,它使您有可能多次读取请求负载。实际上,第一次调用它(在中间件中)时,它会将请求体复制到上下文中。后续调用将从那里读取正文(例如,HTTP处理程序中的调用)。middlewares/middlewares.go
文件型
在这里,我们主要做了三件事。
首先,我们定义了一个
ginBodyLogger
结构体,它嵌入了gin.ResponseWriter
结构体,并添加了一个bytes.Buffer
来记录我们所关心的响应有效负载。然后,我们为方法
Write
提供了一个自定义实现,在写入响应流时将调用该方法。在写入之前,我们将把信息保存在属于ginBodyLogger
结构的缓冲区中。最后,我们通过提供给中间件函数的
logger
跟踪此信息。main.go
文件型
main
包负责初始化我们程序中所需的一切。它涉及两个功能:init
和main
。在
init
函数中,我们初始化记录器。在
main
函数中,我们初始化gin.Engine
示例,对其进行检测,然后运行。如果您运行代码,您应该具有所需的日志。如果不是这样的话,请告诉我,我会回来找你的,谢谢!