Управление конфигурацией ведения журнала с помощью NLog в .NET Core 3
Я использую NLog в служебном приложении.NET Core 3.1. Следуя руководству по NLog, я вставил файл nlog.config для управления конфигурацией.
Теперь я запутался, потому что у меня есть три пункта, где я настраиваю ведение журнала:
1. In the code where I need to create a logger in a dependency injection
context
// Other code...
services.AddScoped<IApplyJcdsCommandsJob, ApplyJcdsCommandsJob>(provider =>
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.ClearProviders()
.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Trace)
.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Trace)
.AddFilter("ApplyJcdsCommandsJob", Microsoft.Extensions.Logging.LogLevel.Trace)
//.AddConsole()
//.AddEventLog();
.AddNLog(configuration);
});
Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger<CommandsJob>();
return new CommandsJob(logger);
})
// Other code...
2. In appSettings.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Trace",
"Microsoft": "Trace"
}
}
}
3. in NLog.config
The default config file produced by the nuget package installation:
<!-- a section of the config -->
<targets>
<target xsi:type="File" name="f"
fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="f" />
</rules>
<!-- ... -->
Я вижу, что если я удалю файл Nlog.config, файл журнала не будет создан. Остальные изменения шва не повлияют.
Как связаны эти конфигурации? Как лучше всего включить / выключить логирование и выставить уровень?
3 ответа
Люди, решившие использовать NLog, обычно также хотят отключить всю MEL-фильтрацию, чтобы избежать путаницы с двумя системами фильтрации. Таким образом, вики-руководство NLog нацелено на этих пользователей.
Думаю, люди, которые в первую очередь используют MEL, вероятно, просто воспользуются new HostBuilder().CreateDefaultBuilder().Build()
(Буду настраивать все со всеми включенными пушками).
Но если придерживаться простого примера, вам нужно удалить:
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
И добавить:
loggingBuilder.AddConfiguration(config.GetSection("Logging"));
Вот так это выглядит:
serviceCollection.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.AddConfiguration(config.GetSection("Logging"));
loggingBuilder.AddNLog(config);
})
ILoggingBuilder.AddConfiguration
можно найти в Nuget: https://www.nuget.org/packages/Microsoft.Extensions.Logging.Configuration/
AddNLog
регистрирует NLog, как любой другой Microsoft Extension Logger (MEL) LoggingProvider (аналогично AddConsole
).
Это означает, что NLog получает вывод журнала только, который был "одобрен" MEL-ILogger. Таким образом, любая фильтрация, настроенная в MEL, предотвратит попадание logevents в NLog.
NLog по-прежнему имеет возможность перенаправлять на требуемые цели NLog на основе имен регистраторов и уровня важности LogLevel.
Вы можете решить, хотите ли вы использовать MEL-Filtering или NLog-Filtering, или их комбинацию. Но если вы просто хотите использовать "чистый" NLog, просто создайте экземплярNLog.Extensions.Logging.NLogLoggerFactory
. Это специализированный ILoggerFactory, который игнорирует MEL-Filtering-Configuration.
Кстати. немного странно, что вы создаете изолированный LoggerFactory для каждого экземпляра CommandsJob. Можно подумать, что вы зарегистрируете тип в структуре внедрения зависимостей и позволите ему вводить параметры конструктора. См. Также этот пример:
Где LoggerFactory создается с AddLogging(...)
и где Runner
зарегистрирован в ServiceCollection для внедрения зависимостей. При создании экземпляраRunner
тогда инъекция зависимостей автоматически предоставит ILogger
как параметр-конструктор.
Обратитесь к этому URL-адресу. Вы получите полное представление о Nlog в ядре asp net
https://www.c-sharpcorner.com/article/introduction-to-nlog-with-asp-net-core2/