Go Джин каркас для входа JSON - PullRequest
0 голосов
/ 29 апреля 2020

Я настраиваю небольшой API, используя Go Gin, однако я не могу убедить регистратор вывести JSON. По умолчанию это строка ключ / значение, но мне нужно это как json.

Как мне этого добиться? Я чувствую, что это должно легко поддерживаться, но я боролся с пользовательской функцией форматирования, где мне нужно учитывать различные параметры самостоятельно.

В качестве альтернативы, я также веду журнал вручную, используя Uber / Zap Logger, но я не нашел способ заменить регистратор джина на мой.

Любые указатели будут оценены, так как документация по git gin джина не слишком полезна.

Спасибо!

РЕДАКТИРОВАТЬ: поясните, что добавление промежуточного программного обеспечения помогает при ведении журнала запросов, но я ищу единственную точку настройки JSON ведение журнала для Gin (например, включая журналы, не связанные с запросами, такие как отладочные / информационные журналы внутренних компонентов фреймворка)

1 Ответ

1 голос
/ 29 апреля 2020

регистратор доступа

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("")
        }
    }
}

регистратор отладки

Глядя на исходный код джина, обнаруживается, что отладка журнал выводится на 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...)
    }
}

set debug write, этот код не тестируется.

// 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 Нет подробного джина записи для использования пользовательского кода сервера, пожалуйста, ознакомьтесь с документацией джина.

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

...