web-dev-qa-db-ja.com

.Net Core 2.0コンソールアプリケーションのログと構成?

次のコードにエラーがあります。 .Net Core 2.0コンソールアプリケーションのログと構成管理をセットアップする正しい方法は何ですか?

エラーCS1061 'LoggerFactory'には 'AddConsole'の定義が含まれておらず、タイプ 'LoggerFactory'の最初の引数を受け入れる拡張メソッド 'AddConsole'が見つかりません(usingディレクティブまたはAssembly参照がありませんか?)

エラーCS1503引数2:「Microsoft.Extensions.Configuration.IConfigurationSection」から「System.Action」に変換できません

class Program
{
    static void Main(string[] args)
    {
        var services = new ServiceCollection();
        ConfigureServices(services);
        var serviceProvider = services.BuildServiceProvider();
        var app = serviceProvider.GetService<Application>();
        Task.Run(() => app.Run()).Wait();
    }

    private static void ConfigureServices(IServiceCollection services)
    {
        ILoggerFactory loggerFactory = new LoggerFactory()
            .AddConsole() // Error!
            .AddDebug();

        services.AddSingleton(loggerFactory); // Add first my already configured instance
        services.AddLogging(); // Allow ILogger<T>

        IConfigurationRoot configuration = GetConfiguration();
        services.AddSingleton<IConfigurationRoot>(configuration);

        // Support typed Options
        services.AddOptions();
        services.Configure<MyOptions>(configuration.GetSection("MyOptions")); // Error!

        services.AddTransient<Application>();
    }

    private static IConfigurationRoot GetConfiguration()
    {
        return new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile("App.config", optional: true).Build();
    }

    public class MyOptions
    {
        public string Name { get; set; }
    }

    public class Application
    {
        ILogger _logger;
        MyOptions _settings;

        public Application(ILogger<Application> logger, IOptions<MyOptions> settings)
        {
            _logger = logger;
            _settings = settings.Value;
        }

        public async Task Run()
        {
            try
            {
                _logger.LogInformation($"This is a console application for {_settings.Name}");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.ToString());
            }
        }
    }
}
21
ca9163d9

いくつかの依存関係が欠落しているようです:

  1. Microsoft.Extensions.Logging.Console は、AddConsole拡張メソッドを提供します。
  2. Microsoft.Extensions.Options.ConfigurationExtensions 、これはConfigure<T>拡張メソッドが見つからないようです。

.NET Core実行可能ファイルでのサービスの構成に関して、Andrew Lockの最初のバージョンの.NET Coreのトピックには post があります。これのいくつかは、.NET Core 2が最近到着したため、今では時代遅れかもしれませんが、読む価値があります。

19
Kirk Larkin

Kirk Larkinsの回答に基づいて(_Microsoft.Extensions.Options.ConfigurationExtensions_、_Microsoft.Extensions.Logging.Console_、_Microsoft.Extensions.Logging.Debug_のnugetパッケージをインストールしてください) ILoggerBuilderから.AddLogging()へ:

_public static IServiceProvider ConfigureServices(IServiceCollection serviceCollection)
{
    //ILoggerFactory loggerFactory = new LoggerFactory()
    //  .AddConsole()
    //  .AddDebug();

    serviceCollection
        .AddLogging(opt =>
        {
            opt.AddConsole();
            opt.AddDebug();
        })
        .AddTransient<IFooService, FooService>();

    /*... rest of config */

    var serviceProvider = serviceCollection.BuildServiceProvider();
    return serviceProvider;
}
_
16
Marco