Это мой первый вопрос, но, пожалуйста, сообщите, могу ли я улучшить его.
У меня есть. 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 помощь будет принята с благодарностью.