2017-08-28 59 views
4

下面的代碼得到了錯誤。爲.Net Core 2.0控制檯應用程序設置日誌記錄和配置管理的正確方法是什麼?.Net核心2.0控制檯應用程序的記錄和配置?

錯誤CS1061「的LoggerFactory」不包含關於「AddConsole」的定義和沒有擴展方法「AddConsole」接受類型爲「的LoggerFactory」的第一參數可以找到(是否缺少using指令或程序集引用?)

錯誤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()); 
      } 
     } 
    } 
} 

回答

5

看起來你可能會丟失一對夫婦的依賴關係轉換:

  1. Microsoft.Extensions.Logging.Console,它提供了AddConsole擴展方法。
  2. Microsoft.Extensions.Options.ConfigurationExtensions,它提供了Configure<T>擴展方法,你似乎缺少。

在配置.NET Core可執行文件中的服務方面,Andrew Lock對第一版.NET Core的主題有一個post。有些.NET Core 2最近的到來可能會過時,但值得一讀。

+0

我加入相當幾個參考文獻和錯誤消失了。現在我運行'var app = serviceProvider.GetService ()'時得到了空值。我已經更新了這個問題。 – ca9163d9

+2

我發佈了一個新問題https://stackoverflow.com/questions/45928025/net-core-2-0-console-program-got-null-value-when-running-serviceprovider-getse。 – ca9163d9

1

大廈在柯克·拉金斯答案(請確保您有的NuGet包installes),可以簡化日誌配置,並通過將在ILoggerBuilder.AddLogging()跳過的LoggerFactory聲明:

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; 
} 
相關問題