代码之家  ›  专栏  ›  技术社区  ›  opensas

netcore:不使用loggerfactory手动创建记录器

  •  1
  • opensas  · 技术社区  · 6 年前

    我正在创建一个控制台记录器,使用:

    _log = new LoggerFactory().AddConsole().CreateLogger(this.GetType().Name);
    

    现在我得到以下警告:

    controllers\DummyController.cs(31,20): warning CS0618:
    'ConsoleLoggerExtensions.AddConsole(ILoggerFactory)' is obsolete: 
    'This method is obsolete and will be removed in a future version. The 
    recommended alternative is AddConsole(this ILoggingBuilder builder).' 
    

    我不在依赖注入容器的上下文中。

    更新: 我也尝试过这样使用DI:

    var serviceProvider = new ServiceCollection()
        .AddLogging()
        .BuildServiceProvider();
    var log = serviceProvider.GetService<ILogger>();
    log.LogInformation("testing _log");
    

    但我得到以下错误:

    Error Message:                                                                                                                                                
      System.ArgumentNullException : Value cannot be null.                                                                                                         
    Parameter name: logger                                                                                                                                        
    Stack Trace:                                                                                                                                                  
       at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, EventId eventId, Exception exception, String message, Object[] args)                                                                                                                                                             
       at Microsoft.Extensions.Logging.LoggerExtensions.LogInformation(ILogger logger, String message, Object[] args)      
    

    我好像拿不到集装箱里的伐木工人

    1 回复  |  直到 5 年前
        1
  •  1
  •   Matthew    5 年前

    如果您正在创建一个DI容器,那么可以使用以下代码从工厂中声明一个记录器实例。

    var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.Create("mylogger");
    logger.LogInformation("Hello {0}", "world");
    

    或者,您可以从类型化接口创建它

    var logger = serviceProvider.GetRequiredService<ILogger<MyType>>();
    logger.LogInformation("Hello {0}", "world");
    

    你是 能够执行以下操作:

    var logger = serviceProvider.GetRequiredService<ILogger>();
    

    由于非泛型接口未在依赖项注入容器中注册,因此,其原因是日志库从泛型类型推断日志程序名称,并且当您使用 ILogger 只是,没有什么可以从中得到名字,对吧 MyProject.MyNamespace.MyType .

    稍微偏离主题,但使用扩展方法 GetRequiredService<T> 而不是 GetService<T> 至少可以帮助您避免空引用异常。