Добавление идентификатора корреляции с использованием Serilog в Seq in. NET Standard Web Api - PullRequest
1 голос
/ 05 августа 2020

Это мой первый вопрос, но, пожалуйста, сообщите, могу ли я улучшить его.

У меня есть. NET Standard Web Api, который использует Serilog для регистрации запросов к серверу Seq. Я хочу добавить идентификатор корреляции к ответам, которые будут использоваться во внешнем интерфейсе для отслеживания запросов.

Вот конфигурация ведения журнала Global.asax :

Log.Logger = new LoggerConfiguration()
             .Enrich.With<HttpRequestIdEnricher>()
             .Enrich.FromLogContext()
             .WriteTo.Seq(ConfigurationManager.AppSettings["Seq:Url"])
             .CreateLogger();

I есть обработчик сообщений, который добавляет идентификатор корреляции ко всем запросам:

public class AddCorrelationIdToResponseHandler : DelegatingHandler
    {
        private const string CorrelationIdHeaderName = "X-Correlation-Id";

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var responseMessage = await base.SendAsync(request, cancellationToken);
            var correlationId = request.GetCorrelationId().ToString();
            
            responseMessage
                .Headers
                .Add(CorrelationIdHeaderName, correlationId);

            return responseMessage;
        }
    }

Проблема в том, что enricher (по понятным причинам) не добавляет HttpRequestId в заголовки ответов, поэтому я не могу использовать его во внешнем интерфейсе и Я не могу получить здесь идентификатор корреляции в журналах Seq.

Вот что я пытался добавить в обработчик:

LogContext.PushProperty(CorrelationIdHeaderName, correlationId)
Log.ForContext(CorrelationIdHeaderName, correlationId)

оба безрезультатно.

Я также заключил весь обработчик в оператор using с оператором LogContext.

Пример записи Seq здесь

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

Есть ли способ получить доступ к HttpRequestId, чтобы добавить его в заголовок, или иначе, как я могу установить идентификатор корреляции на d isplay как свойство в журналах Seq? В крайнем случае, можно ли отключить автоматическое ведение журнала c Web Api и регистрировать запросы вручную с помощью Log.Information или Log.Error (в этом случае контекст журнала должен работать теоретически)?

Any помощь будет принята с благодарностью.

...