C# .Net core 2.0控制台应用程序的日志记录和配置?

C# .Net core 2.0控制台应用程序的日志记录和配置?,c#,.net,.net-core,C#,.net,.net Core,下面的代码得到了错误。为.Net Core 2.0控制台应用程序设置日志记录和配置管理的正确方法是什么 错误CS1061“LoggerFactory”不包含“AddConsole”的定义,并且找不到接受“LoggerFactory”类型的第一个参数的扩展方法“AddConsole”(是否缺少using指令或程序集引用?) 错误CS1503参数2:无法从“Microsoft.Extensions.Configuration.IConfigurationSection”转换为“System.Acti

下面的代码得到了错误。为.Net Core 2.0控制台应用程序设置日志记录和配置管理的正确方法是什么

错误CS1061“LoggerFactory”不包含“AddConsole”的定义,并且找不到接受“LoggerFactory”类型的第一个参数的扩展方法“AddConsole”(是否缺少using指令或程序集引用?)

错误CS1503参数2:无法从“Microsoft.Extensions.Configuration.IConfigurationSection”转换为“System.Action”

类程序
{
静态void Main(字符串[]参数)
{
var services=newservicecolection();
配置服务(服务);
var serviceProvider=services.BuildServiceProvider();
var app=serviceProvider.GetService();
Task.Run(()=>app.Run()).Wait();
}
专用静态void配置服务(IServiceCollection服务)
{
ILoggerFactory loggerFactory=新loggerFactory()
.AddConsole()//错误!
.AddDebug();
services.AddSingleton(loggerFactory);//首先添加我已配置的实例
services.AddLogging();//允许ILogger
IConfigurationRoot配置=GetConfiguration();
services.AddSingleton(配置);
//支持类型化选项
services.AddOptions();
services.Configure(configuration.GetSection(“MyOptions”);//错误!
services.AddTransient();
}
专用静态IConfigurationRoot GetConfiguration()
{
返回新的ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile(“App.config”,可选:true).Build();
}
公共类选项
{
公共字符串名称{get;set;}
}
公共类应用程序
{
ILogger\u记录器;
MyOptions\u设置;
公共应用程序(ILogger记录器、IOPS设置)
{
_记录器=记录器;
_设置=设置.值;
}
公共异步任务运行()
{
尝试
{
_logger.LogInformation($“这是一个用于{u settings.Name}的控制台应用程序”);
}
捕获(例外情况除外)
{
_logger.LogError(例如ToString());
}
}
}
}

看起来您可能缺少几个依赖项:

  • ,它提供了
    AddConsole
    扩展方法
  • ,它提供您似乎缺少的
    Configure
    扩展方法

  • 在配置.NET Core可执行文件中的服务方面,Andrew Lock对.NET Core的第一个版本的主题有自己的见解。随着.NET Core 2最近的推出,其中一些内容可能已经过时,但值得一读。

    基于柯克·拉金斯的回答(确保已安装nuget软件包,
    Microsoft.Extensions.Options.ConfigurationExtensions
    Microsoft.Extensions.Logging.Console
    Microsoft.Extensions.Logging.Debug
    )然后,您可以通过将
    ILoggerBuilder
    传递到
    .AddLogging()
    ,简化日志配置并跳过loggerFactory的声明:

    公共静态IServiceProvider配置服务(IServiceCollection serviceCollection)
    {
    //ILoggerFactory loggerFactory=新loggerFactory()
    //.AddConsole()
    //.AddDebug();
    服务集合
    .AddLogging(opt=>
    {
    opt.AddConsole();
    opt.AddDebug();
    })
    .AddTransient();
    /*…配置的其余部分*/
    var serviceProvider=servicecolection.BuildServiceProvider();
    返回服务提供商;
    }
    
    主题外:使用
    GetSection(nameof(MyOptions))
    而不是
    GetSection(“MyOptions”)
    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());
                }
            }
        }
    }
    
    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;
    }