Я пытаюсь научиться использовать промежуточное ПО в Go. Мне удалось отправить объект регистратора с контекстом запроса в функции обработчика. Но как только запрос обработан и объект регистратора заполнен данными/ошибками из функций обработчика, я хочу иметь доступ к измененному объекту. Но согласно моей текущей реализации я получаю нулевой объект.
logger := log.WithFields(log.Fields{
ReqIdKey: reqId,
"proto": r.Proto,
"method": r.Method,
"uri": r.URL.RequestURI(),
"startTime": time.Now(),
"body": t,
"header": r.Header,
"remote-addr": r.RemoteAddr,
})
ctx = context.WithValue(ctx, "logger", logger)
//Update as per suggestions recieved.
r = r.WithContext(ctx)
m := httpsnoop.CaptureMetrics(next, w, r)
//Post this point the internal functions modify the log and add errors etc extra fields which I want to access
//For example:
//logger := logcontext.GetLogCtx(ctx)
//logger = logger.WithFields(log.Fields{"error": err})
logger = logger.WithFields(log.Fields{
"responseTime": m.Duration,
"status": m.Code,
})
return logger.Info("Request Completed")
Получен ответ:
{"body":null,"header":{"Accept":["*/*"],"Accept-Encoding":["gzip, deflate, br"],"Connection":["keep-alive"],"Postman-Token":["a1ef5d6c-94cb-4b64-b350-700c37eff6b4"],"User-Agent":["PostmanRuntime/7.26.2"]},"level":"info","method":"GET","msg":"Request completed","proto":"HTTP/1.1","remote-addr":"127.0.0.1:36254","responseTime":2463797,"startTime":"2020-07-28T00:31:22.97954465+05:30","status":503,"time":"2020-07-28T00:31:22+05:30","uri":"/api/v1/getSomething/some/xyz/abc/2","x-request-id":"f493a4ad-035c-48a8-9207-64a922c96961"}
Ожидание добавленного поля ошибки от функции-обработчика.
Я знаю, что в этом случае есть некоторая концептуальная ошибка, но не могу ее понять.
Итак, в основном я хочу регистрировать все один раз, а не несколько раз, для этого нужно получить окончательные поля и все только в промежуточном программном обеспечении.
logger
, просто используйте ее вместо того, чтобы возвращать ее из контекста. - person Adrian   schedule 27.07.2020WithFields
, возвращаемый регистратор представляет собой оболочку оригинала. Эти поля не добавляются в исходный регистратор, а добавляются только в новый регистратор. - person Burak Serdar   schedule 27.07.2020