Как вы можете запретить 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 здесь.
Это также возможно с тем же подходом из кода, см. Здесь.