Мне было интересно, есть ли способ использовать свойства события с необработанным исключением в .net core web api с NLog?
Вот мой пример кода
Действие контроллера API
[HttpGet("ThrowError")]
public void ThrowError()
{
throw new Exception("My Test Exception");
}
Nlog.config target
<target xsi:type="Mail"
name="mailserver1"
html="true"
replaceNewlineWithBrTagInHtml="true"
encoding="UTF-8"
subject="Attention Error!!!"
body="MyValue: ${event-properties:item=MyValue} ${newline} <strong>Date:</strong> ${date} ${newline} <strong>Message:</strong> ${message} ${newline} <strong>Exception:</strong> ${exception:tostring}"
to=""
from=""
smtpServer=""
smtpUsername=""
smtpPort=""
enableSsl=""
smtpAuthentication=""
smtpPassword=""/>
Как видно из атрибута тела письма, свойство события I называется MyValue. Я могу легко установить Мое значение с помощью приведенного ниже кода для обработанного исключения
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Error, "", "Pass my custom value");
theEvent.Properties["MyValue"] = "My custom string";
logger.Log(theEvent);
Однако, для непредвиденной / необработанной ошибки (например, вызов действия ThrowError API в приведенном выше примере кода) NLog автоматически отправляет электронную почту, и у меня не установлено значение свойства события.
Я попробовал код промежуточного программного обеспечения, как показано ниже, но исключение регистрируется до вызова кода промежуточного программного обеспечения
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
var errorFeature = context.Features.Get<IExceptionHandlerFeature>();
var exception = errorFeature.Error;
var serviceProvider = app.ApplicationServices;
var logger = LogManager.GetCurrentClassLogger();
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Error, "", exception.StackTrace);
theEvent.Properties["MyValue"] = "My custom string";
logger.Log(theEvent);
});
});
Буду признателен за любую помощь. Спасибо.