Ведение журнала на основе среды в .NetCore 2.2 с использованием ILoggerProvider
Я работаю над механизмом ведения журнала.Net Core 2.2. Пока экспериментировал с ведением журнала в зависимости от окружения. Итак, я создал два новых файла appSettings.json с соответствующими средами вместе с appSettings.json, присутствующим в решении. Один для разработки, другой для производственной среды.
appsettings.json
{
"Logging": {
"LogLevel": {
//"Default": "Debug",
//"System": "Information",
//"Microsoft": "Error"
}
}
}
appsettings.Development.json
{
"Logging": {
"LogLevel": {
"Microsoft": "Information"
}
}
}
appSettings.Production.json
{
"Logging": {
"Console": {
"LogLevel": {
"Microsoft": "Critical"
}
}
}
}
Изменен файл StartUp.cs
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
var currentEnvironment = env.EnvironmentName;
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{currentEnvironment}.json", optional: true);
}
Метод регистрации
public void LogExceptionToConsole()
{
_logger.LogError("This is raised by error");
_logger.LogCritical("This is raised by critical ");
}
И запустите Settings.json
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:2131",
"sslPort": 44388
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
},
"DemoLoggingApplication": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Я понимаю, что параметры appSettings, специфичные для среды, будут иметь наивысший приоритет. И у меня есть два вопроса
1) Производится ли ведение журнала для конкретной среды? Если да, то какие могут быть изменения в приведенной выше логике.
2) Когда я запустил приложение в режиме разработки на DemoLoggingApplication
профиль. Я вижу всеInformation,Error & Critical
журналы.
Но когда я изменил ASPNETCORE_ENVIRONMENT
значение от Development
к Production
за DemoLoggingApplication
profile и запустил приложение, и я снова смог увидеть оба журнала типа Error
& Critical
. Я установил этоConsole
провайдер должен только отображать Critical
бревна типа Microsoft
категория. Я был показан Errors
журналы тоже.
Хотя я читал документы Microsoft, я не мог понять расстановку приоритетов. Может ли кто-нибудь объяснить мне подробно, почему я вижу оба журнала. Я не понимаю. Пожалуйста, помогите мне.
заранее спасибо
Обновил вопрос после ответа Боба. Он работал после изменения appsettings.json, appsettings.Development.json и appSettings.Production.json.
appSettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
appsettings.Development.json
{
"Logging": {
"Console": {
"LogLevel": {
"Microsoft": "Information",
"Default": "Information" // newly
}
}
}
}
appSettings.Production.json
{
"Logging": {
"Console": {
"LogLevel": {
"Microsoft": "Critical",
"Default" : "Critical" // newly added line
}
}
}
}
Теперь, когда я изменил среду на Development
, Я мог войти из Information
но только после добавления Default
категории как для разработки, так и для производства.
Я просто хотел знать, почему такое поведение? И каково влияние поддержкиappsettings.json -> Logging
когда у нас есть настройки для разработки и производства.
Благодарность
1 ответ
Ведение журнала зависит от среды.
В вашем примере и appsettings.Development.json, и appsettings.Production.json определяют LogLevel только для категории "Microsoft". Но ведение журнала, выполняемое из вашего кода, попадает в другую категорию журналов, уровень журнала которой не определен в файлах кода / конфигурации. Следовательно, он принимает минимальный уровень журнала по умолчанию как "Информация" в обеих средах.
Чтобы увидеть разницу, добавьте ключ "По умолчанию" с разными настройками LogLevel в разных средах, как показано ниже:
appsettings.Development.json
{
"Logging": {
"LogLevel": {
"Microsoft": "Information",
"Default": "Error"
}
}
}
appSettings.Production.json
{
"Logging": {
"Console": {
"LogLevel": {
"Microsoft": "Critical",
"Default": "Critical"
}
}
}
}