首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go Gin框架登录JSON

Go Gin框架登录JSON
EN

Stack Overflow用户
提问于 2020-04-29 17:50:39
回答 1查看 6.1K关注 0票数 1

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

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

或者,我也可以使用uber/zap logger手动记录日志,但我还没有找到一种方法来用我的日志程序替换gin的logger。

由于gin的github文档不太有帮助,因此任何提示都将不胜感激。

谢谢!

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 19:55:30

访问记录器

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

代码语言:javascript
复制
// 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输出的方法。

代码语言:javascript
复制
func debugPrint(format string, values ...interface{}) {
    if IsDebugging() {
        if !strings.HasSuffix(format, "\n") {
            format += "\n"
        }
        fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...)
    }
}

set debug write,此代码不是测试。

代码语言:javascript
复制
// 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,并创建由指定io.Writer输出的log.Logger以接收来自http.Sever的错误日志没有详细编写gin以使用自定义服务器代码,请查看gin文档。

代码语言:javascript
复制
srv := &http.Server{
    // log level is bebug, please create a error level io.Writer
    ErrorLog: log.New(NewLogrusWrite(), "", 0),
} 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61498943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档