Настройка формата журнала в реализации LoggingHandlers в обработчиках Gorilla In GO - PullRequest
0 голосов
/ 29 июня 2018

Я хочу настроить формат ведения журнала в реализации обработчика gorilla в LoggingHandler . В основном это дает формат общего журнала по умолчанию. Я хочу настроить на основе заголовков запроса. Предположим, я передаю значение tenantId как заголовок одного запроса. Затем я хочу добавить его в os.StdOut.

r := mux.NewRouter()
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("This is a catch-all route"))
})
loggedRouter := handlers.LoggingHandler(os.Stdout, r)

127.0.0.1 - sandun [10 / Oct / 2018: 13: 55: 36 -0700] "GET / api / request HTTP / 1.0" 200 2326

Затем запросите заголовок

teanantId: 50

ожидаемый результат

127.0.0.1 - sandun [10 / Oct / 2018: 13: 55: 36 -0700] "GET / api / request HTTP / 1.0" 200 2326 50

Я хочу добавить tenantid последним в вывод журнала.

Как мне это сделать без изменения обработчиков горилл liabry .

Подробнее ... : я могу сделать это, изменив внутренний код библиотеки обработчиков горилл.

// buildCommonLogLine builds a log entry for req in Apache Common Log Format.
// ts is the timestamp with which the entry should be logged.
// status and size are used to provide the response HTTP status and size.
func buildCommonLogLine(req *http.Request, url url.URL, ts time.Time, status int, size int) []byte {
    tenantId, err := strconv.Atoi(req.Header.Get("tenantid"))
    if err != nil {
        tenantId = 0
    }
    username := "-"
    if url.User != nil {
        if name := url.User.Username(); name != "" {
            username = name
        }
    }

    host, _, err := net.SplitHostPort(req.RemoteAddr)

    if err != nil {
        host = req.RemoteAddr
    }

    uri := req.RequestURI

    // Requests using the CONNECT method over HTTP/2.0 must use
    // the authority field (aka r.Host) to identify the target.
    // Refer: https://httpwg.github.io/specs/rfc7540.html#CONNECT
    if req.ProtoMajor == 2 && req.Method == "CONNECT" {
        uri = req.Host
    }
    if uri == "" {
        uri = url.RequestURI()
    }

    buf := make([]byte, 0, 3*(len(host)+len(username)+len(req.Method)+len(uri)+len(req.Proto)+50)/2)
    buf = append(buf, host...)
    buf = append(buf, " - "...)
    buf = append(buf, username...)
    buf = append(buf, " ["...)
    buf = append(buf, ts.Format("02/Jan/2006:15:04:05 -0700")...)
    buf = append(buf, `] "`...)
    buf = append(buf, req.Method...)
    buf = append(buf, " "...)
    buf = appendQuoted(buf, uri)
    buf = append(buf, " "...)
    buf = append(buf, req.Proto...)
    buf = append(buf, `" `...)
    buf = append(buf, strconv.Itoa(status)...)
    buf = append(buf, " "...)
    buf = append(buf, strconv.Itoa(size)...)
    buf = append(buf, " "...)
    buf = append(buf, strconv.Itoa(tenantId)...)
    return buf
}

Но я думаю, что это не очень хорошее решение. Я ожидаю хорошего решения от этого сообщества.

ценю вашу помощь.

1 Ответ

0 голосов
/ 29 июня 2018

Библиотека обработчиков Gorilla использует Общий формат журнала Apache . Изменение формата вывода делает ваши сообщения журнала абсолютно неясными для всех, кроме вас.

Идиоматический способ: создать свой собственный обработчик промежуточного программного обеспечения, который записывает в выходное (или любое другое io.Writer) значение заголовка teanantId.

Второй (неправильный, на мой взгляд) способ: разветвить репозиторий, изменить поведение и использовать его.

...