Ведение журнала на основе среды в .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"
      }
    }
  }
}
Другие вопросы по тегам