Как вы можете запретить NLog обрабатывать операторы журнала в ссылочных библиотеках?

Всякий раз, когда в нашем API возникает ошибка, мы получаем несколько писем для одной ошибки. На основе сообщений журнала; мы можем видеть, что эти другие электронные письма, похоже, создаются, потому что различные библиотеки Microsoft вызывают что-то вроде_logger.LogError а также наш собственный _logger.LogError это происходит, когда мы обрабатываем ошибку.

Например, когда истекает время ожидания базы данных, мы видим 4 письма от этих разных классов:

  • Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Query
  • Web.Controllers.ErrorController (наш собственный обработчик исключений; это единственный, который мы хотим видеть)

Последний - единственный, у которого есть собственное форматирование ошибок с полезной информацией, такой как текущий пользователь и т.д. Остальные просто содержат трассировку стека, которая уже находится в нашем собственном отформатированном письме.

Мы не можем точно определить, откуда берутся эти другие сообщения журнала; но наиболее вероятно, что я могу думать о том, что в библиотеках Microsoft они вызывают_logger.LogError(), и наша собственная конфигурация NLog обрабатывает все экземпляры LogError; вместо того, чтобы просто заниматься своими собственными.

Как мы можем предотвратить регистрацию этих других операторов журнала и, в частности, их отправку нам по электронной почте?

Это наша установка в Program.cs:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                    WebHost.CreateDefaultBuilder(args)
                        .UseStartup<Startup>()
                         .ConfigureLogging(logging =>
                         {
                             logging.ClearProviders();
                             logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                         })
                    .UseNLog();

1 ответ

Решение

Вы можете отфильтровать это в.NET Core - потому что вы используете интеграцию Microsoft.Extensions.Logging, и Microsoft отправляет на это сообщения - и в NLog.

Настроить в.NET Core

Измените конфигурацию, например appsettings.json. Например как минимум ошибка для всех Microsoft.* И Предупреждение для Microsoft.EntityFrameworkCore.*

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Error",
      "Microsoft.EntityFrameworkCore": "Warning"
    }
  }
}

Обратите внимание, это не относится к NLog, поэтому вы не можете использовать имена уровней NLog. возможные названия уровней

Подробнее об этом подходе читайте здесь.

Настроить NLog

Или вы можете настроить в конфигурации NLog.

В NLog.config отредактируйте <rules>.Эти правила обрабатываются сверху вниз.

  • Вы можете отфильтровать пространство имен с помощью name атрибут (* разрешается)
  • Без writeTo атрибут, журналы отбрасываются
  • Если в правиле есть final="true" и соответствует событиям, следующее правило не будет обработано.

Например:

<rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Info" final="true" /> <!-- BlackHole without writeTo -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>

Вы можете прочитать о правилах nlog.config здесь.

Это также возможно с тем же подходом из кода, см. Здесь.

Другие вопросы по тегам