Я пишу обогатитель для Serilog, и я хочу, чтобы добавить свойство, которое может вызвать новое событие журнала, на практике:StackOverflowException в Serilog Обогатитель
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
ISession session = /* HttpContext.Session */;
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("ValueFromSession", session.GetString("ValueFromSession")));
/* other properties ... */
}
Я хочу, чтобы иметь возможность добавить значение из моя сессия http к моим журналам, поэтому я использую LogContext.PushProperties
с пользовательским расширителем. ASP.NET Core регистрирует предупреждение всякий раз, когда считывается истекший сеанс, который запускает мой обогатитель, но всякий раз, когда я пытаюсь прочитать сеанс в расширителе, он предупреждает меня об истекшем сеансе, который запускает новый экземпляр моего enricher (ad infitum). Это вызывает StackOverflowException
, который, похоже, не улавливается блоком try
.
Есть ли способ отключить ведение журнала при использовании метода Enrich
? Или я могу каким-то образом обнаружить такую рекурсию (кроме разбора stacktrace)?
проверьте, существует ли какая-либо циклическая ссылка – Mostafiz
Существует косвенная ссылка между моим кодом и ASP.NET, как описано в вопросе, но я не могу удалить ссылку, потому что мне нужно иметь возможность читать с сеанса и Я хочу, чтобы ASP.NET предупреждал меня об истекших сеансах. –
Исключения, вызванные из 'Enrich()', должны быть захвачены Serilog и не приводить к срабатыванию другого обработчика исключений верхнего уровня. Похоже, что-то еще может происходить здесь; вы можете добавить трассировку стека к вопросу? Ура! –