如何在 ASP.NET MVC 6 中注册 ILogger 以进行注入
How to register ILogger for injection in ASP.NET MVC 6
我有一个 ASP.NET MVC 6 (beta-4) 应用程序。
public void ConfigureServices(IServiceCollection services)
{
// Logging
services.AddLogging();
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
// Add the console logger.
loggerfactory.AddConsole(minLevel: LogLevel.Warning);
// ...
}
我有一个控制器...
public class HomeController :
Controller
{
ILogger _logger;
public HomeController(ILogger logger)
{
_logger = logger;
}
// ...
}
但是当我无法以某种方式正确注册服务时:InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.
。注册记录器我做错了什么?
我认为 services.AddLogging();
做了正确的事情并注册了 ILogger
。看了源码(https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs)发现其实是在注册ILogger<>
。将 ILogger
的签名更改为 ILogger<HomeController>
可使上述示例生效。
public class HomeController :
Controller
{
ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
// ...
}
感谢@Steve 让我走上了正确的轨道来找到它。
services.AddLogging();
对我不起作用,所以我将这两个语句添加到 ConfigureServices
:
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
现在 DI 容器很开心,一切正常。
只需将此行添加到 ConfigureServices
services.AddSingleton(Serilog.Log.Logger);
.NET 5.0解决方案;它也适用于普通控制器和通用控制器:
public class EnhancedGeneric<T> : BaseApiController
{
private readonly ILogger _logger;
public EnhancedGeneric(ILoggerFactory logger)
{
_logger = logger.CreateLogger(typeof(T).Name);
}
public void OnGet()
{
_logger.LogInformation("GET pages called.");
}
}
我有一个 ASP.NET MVC 6 (beta-4) 应用程序。
public void ConfigureServices(IServiceCollection services)
{
// Logging
services.AddLogging();
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
// Add the console logger.
loggerfactory.AddConsole(minLevel: LogLevel.Warning);
// ...
}
我有一个控制器...
public class HomeController :
Controller
{
ILogger _logger;
public HomeController(ILogger logger)
{
_logger = logger;
}
// ...
}
但是当我无法以某种方式正确注册服务时:InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.
。注册记录器我做错了什么?
我认为 services.AddLogging();
做了正确的事情并注册了 ILogger
。看了源码(https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs)发现其实是在注册ILogger<>
。将 ILogger
的签名更改为 ILogger<HomeController>
可使上述示例生效。
public class HomeController :
Controller
{
ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
// ...
}
感谢@Steve 让我走上了正确的轨道来找到它。
services.AddLogging();
对我不起作用,所以我将这两个语句添加到 ConfigureServices
:
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
现在 DI 容器很开心,一切正常。
只需将此行添加到 ConfigureServices
services.AddSingleton(Serilog.Log.Logger);
.NET 5.0解决方案;它也适用于普通控制器和通用控制器:
public class EnhancedGeneric<T> : BaseApiController
{
private readonly ILogger _logger;
public EnhancedGeneric(ILoggerFactory logger)
{
_logger = logger.CreateLogger(typeof(T).Name);
}
public void OnGet()
{
_logger.LogInformation("GET pages called.");
}
}