консольное приложение netcore2 настраивает уровень журнала в appsettings

#.net-core #.net-core-2.0 #.net-core-logging #.net-core-configuration

#.net-core #.net-core-2.0 #.net-ядро-ведение журнала #.net-core-конфигурация #.net-core-ведение журнала #.net-core-configuration

Вопрос:

Я пытаюсь добавить регистратор в свое консольное приложение. Вся конфигурация применяется правильно, за исключением Logging

Program.cs Программа.cs:

    private static void Main(string[] args)
    {
        var services = new ServiceCollection();
        ConfigureServices(services);

        var serviceProvider = services.BuildServiceProvider();

        serviceProvider.GetService<App>().Run();
        Console.ReadKey();
    }

    private static void ConfigureServices(ServiceCollection services)
    {

        var envName = Environment.GetEnvironmentVariable("MY_ENV") ?? DevelopmentEnvName;

        var configuration = new ConfigurationBuilder()
                            .SetBasePath(Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json", false)
                            .AddJsonFile($"appsettings.{envName}.json", true, true)
                            .AddEnvironmentVariables()
                            .Build();

        services.AddSingleton(configuration);
        services.AddLogging(builder =>
                            {
                                builder.AddConfiguration(configuration)
                                       .AddConsole()
                                       .AddDebug();
                            });

        ConfigureOptions(services, configuration);

        ConfigureDependencies(services);
    }
  

В App.Run() я пытаюсь выполнить отладку журнала и информационное сообщение

  public void Run()
 {
    _logger.LogDebug("Debug");
    _logger.LogDebug(_appOptions.Env);   //print nothing

    _logger.LogInformation("Info");
    _logger.LogInformation(_appOptions.Env);  //print Info and debug env lines
 }
  

appsettings.json:

  {
     "Logging": {
         "IncludeScopes": false,
         "LogLevel": {
              "Default": "Information"
         }
     },
     "AppOptions": {
         "Env": "none"
     }
}
  

appsettings.Dev.json:

  {
     "Logging": {
         "IncludeScopes": false,
         "LogLevel": {
              "Default": "Debug"
         }
     },
     "AppOptions": {
         "Env": "debug env"
     }
}
  

Что мне нужно изменить, чтобы контролировать уровень журнала с помощью настроек json?

Комментарии:

1. Ваш вопрос неясен, и в нем отсутствует некоторая информация. Я изо всех сил старался собрать недостающие биты и ответить на них ниже.

Ответ №1:

Короткий ответ таков: вы пропускаете GetSection звонок в вашем AddConfiguration .

 builder.AddConfiguration(configuration.GetSection("Logging"))...
  

Это моя реконструкция вашей программы:

Консольное приложение 1.csproj

 <Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.2.4" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.Dev.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

  

Program.cs Программа.cs

 using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Configuration;
using System;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var services = new ServiceCollection();
            var envName = Environment.GetEnvironmentVariable("MY_ENV") ?? "Dev";

            var configuration = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile($"appsettings.{envName}.json", false, true)
                                .AddEnvironmentVariables()
                                .Build();

            services.AddSingleton<IConfiguration>(configuration);
            services.AddLogging(builder =>
            {
                builder.ClearProviders();

                builder.AddConfiguration(configuration.GetSection("Logging"))
                       .AddConsole()
                       .AddDebug();
            });

            var provider = services.BuildServiceProvider();
            var config = provider.GetService<IConfiguration>();
            var appOptions = new AppOptions();

            config.GetSection("AppOptions").Bind(appOptions);

            var logger = provider.GetService<ILogger<Program>>();

            logger.LogDebug("Debug");
            logger.LogDebug(appOptions.Env);   //print nothing

            logger.LogInformation("Info");
            logger.LogInformation(appOptions.Env);  //print Info and debug env lines

            Console.ReadLine();
        }
    }

    public class AppOptions
    {
        public string Env { get; set; }
    }
}

  

AppSettings.json

 {
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
  "AppOptions": {
    "Env": "none"
  }
}
  

AppSettings.Dev.json

 {
  "Logging": {
    "LogLevel": {
      "Default": "Debug"
    }
  },
  "AppOptions": {
    "Env": "debug env"
  }
}
  

Комментарии:

1. Спасибо, Хирал. Мне потребовалось совсем немного минут (возможно, час или два), чтобы найти это! Решена проблема!