.Net Core Web Api со свойствами событий Nlog для необработанного исключения - PullRequest
0 голосов
/ 13 июня 2019

Мне было интересно, есть ли способ использовать свойства события с необработанным исключением в .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} &lt;strong&gt;Date:&lt;/strong&gt; ${date} ${newline} &lt;strong&gt;Message:&lt;/strong&gt; ${message} ${newline} &lt;strong&gt;Exception:&lt;/strong&gt; ${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);
                });
            });

Буду признателен за любую помощь. Спасибо.

1 Ответ

0 голосов
/ 15 июня 2019

В итоге я использовал средство визуализации пользовательских макетов для заполнения значения и на стороне nlog.config использовал средство рендеринга «когда», чтобы избежать многократного вызова моего средства визуализации пользовательских макетов

...