Ведение журнала Golang с сопоставленным диагностическим контекстом

Как добиться ведения журнала MDC (Java ) в GoLang?

Мне нужно добавить UUID во все журналы сервера, чтобы иметь возможность отслеживать одновременные запросы.


person Gabe    schedule 08.12.2016    source источник
comment
Это помогает: https://joeshaw.org/revisiting-context-and-http-handler-for-go-17/   -  person Gabe    schedule 13.12.2016


Ответы (1)


Java MDC использует локальное хранилище потоков, чего нет в Go.

Самое близкое — пропустить через стек Context.

Это то, что все больше и больше библиотек делают в Go.

Несколько типичным способом является сделать это с помощью пакета промежуточного программного обеспечения, который добавляет идентификатор запроса в контекст веб-запроса, например:

req = req.WithContext(context.WithValue(req.Context(),"requestId",ID))

Затем, предполагая, что вы передаете контекст, вы извлекаете его с помощью ctx.Value("requestId") и используете везде, где это имеет смысл.

Возможно создание собственной пользовательской функции регистратора, например:

func logStuff(ctx context.Context, msg string) {
    log.Println(ctx.Value("requestId"),msg) // call stdlib logger
}

Есть куча способов, которыми вы можете справиться с этим, но это довольно простая форма.

person David Budworth    schedule 08.12.2016
comment
Go не перестает удивлять дурацкими дизайнерскими решениями, которые были решены во многих других языках и экосистемах. - person devshorts; 15.11.2018
comment
Конечно, есть места, где можно сказать, хм, странно. Я не думаю, что это один из них. Threadlocals — отличный источник ошибок в языках, в которых они есть. Люди используют в качестве костыля для плохого дизайна приложения и, особенно в системе типа RPC, часто забывают очистить значения, смешивая данные из одного запроса в другой. - person David Budworth; 26.11.2018
comment
Не используйте строку в качестве ключа. Вместо этого используйте значение закрытого типа, чтобы избежать конфликтов. type requestIdKey struct{} req = req.WithContext(context.WithValue(req.Context(),requestIdKey{},ID)) - person dolmen; 22.10.2019