去Gin框架登录JSON
Go Gin framework to log in JSON
我正在使用 Go Gin 设置一个小型 API,但是我无法说服记录器输出 JSON。默认情况下它是一个 key/value 字符串,但我需要它作为 json.
我怎样才能做到这一点?我觉得它应该很容易支持,但我一直在努力使用自定义格式功能,我需要自己考虑各种参数。
或者,我也使用 uber/zap 记录器手动记录,但我还没有找到用我的记录器替换 gin 的记录器的方法。
任何指点将不胜感激,因为杜松子酒 github 的文档没有太大帮助。
谢谢!
编辑:澄清一下,添加中间件有助于记录请求,但我正在寻找单点设置 JSON Gin 日志记录(例如:包括与请求无关的日志,例如调试 /框架内部的信息日志)
访问记录器
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.Server.Errorlog.
的处理输出的方法
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.Server 错误日志。
htt.Server
htt.Server输出日志到一个log.Logger,并创建一个log.Logger输出指定的io.Writer接收来自http.Sever的Error日志 有没有详细写gin使用自定义Sever代码,请查看gin文档。
srv := &http.Server{
// log level is bebug, please create a error level io.Writer
ErrorLog: log.New(NewLogrusWrite(), "", 0),
}
我正在使用 Go Gin 设置一个小型 API,但是我无法说服记录器输出 JSON。默认情况下它是一个 key/value 字符串,但我需要它作为 json.
我怎样才能做到这一点?我觉得它应该很容易支持,但我一直在努力使用自定义格式功能,我需要自己考虑各种参数。
或者,我也使用 uber/zap 记录器手动记录,但我还没有找到用我的记录器替换 gin 的记录器的方法。
任何指点将不胜感激,因为杜松子酒 github 的文档没有太大帮助。
谢谢!
编辑:澄清一下,添加中间件有助于记录请求,但我正在寻找单点设置 JSON Gin 日志记录(例如:包括与请求无关的日志,例如调试 /框架内部的信息日志)
访问记录器
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.Server.Errorlog.
的处理输出的方法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.Server 错误日志。
htt.Server
htt.Server输出日志到一个log.Logger,并创建一个log.Logger输出指定的io.Writer接收来自http.Sever的Error日志 有没有详细写gin使用自定义Sever代码,请查看gin文档。
srv := &http.Server{
// log level is bebug, please create a error level io.Writer
ErrorLog: log.New(NewLogrusWrite(), "", 0),
}