如何使用 Serilog 和 AutoFac 在控制台应用程序中获取 Microsoft.Extensions.Logging<T>?
How to get Microsoft.Extensions.Logging<T> in console application using Serilog and AutoFac?
我们在 ASP.NET 核心应用程序中有共同的 BL 类 进入 ctor:
Microsoft.Extensions.Logging.ILogger<Foo>
在 ASP.NET Core 中,ASP.NET 的内部基础结构通过 LoggerFactory
处理获取 ILogger。
我们现在想在控制台应用程序中重用这些 BL 类(用于异步作业),我们如何设置 AutoFac 和 Serilog 以注入 Microsoft.Extensions.Logging.ILogger<T>
在 LoggerFactory
不存在的环境中?
Microsoft.Extensions.Logging
(参见 source)不是 ASP.NET 核心的一部分,可以 运行 独立于它。您需要做的就是注册 ILoggerFactory
和 ILogger<>
接口。
ILoggerFactory
is used by Logger<T>
实例化实际的记录器。
在控制台应用程序中使用日志扩展时,建议仍然使用 IServiceCollection
,因为这允许您使用 IServiceCollection
extension methods 注册所有支持此功能的包模式。
var services = new ServiceCollection();
services.AddLogging();
// Initialize Autofac
var builder = new ContainerBuilder();
// Use the Populate method to register services which were registered
// to IServiceCollection
builder.Populate(services);
// Build the final container
IContainer container = builder.Build();
这是推荐的方法,因为您不必详细考虑 类 需要为具有 Microsoft.Extensions.DependencyInjection
集成支持的库注册。
当然你也可以手动注册,但是当Microsoft.Extensions.Logging
库发生变化时(添加了新的依赖),你不会得到它,首先必须弄清楚或挖掘into the source code 查找错误。
builder.RegisterType<LoggerFactory>()
.As<ILoggerFactory>()
.SingleInstance();
builder.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
剩下的就是在构建容器之后或应用程序启动之前注册记录器类型:
var loggerFactory = container.Resolve<ILoggerFactory>();
loggerFactory.AddConsole()
.AddSerilog();
并在您的服务中像往常一样注入 ILogger<MyService>
。
在控制台应用 Main 方法中
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
IConfigurationRoot configuration = builder.Build();
var serviceProvider = new ServiceCollection()
.AddDbContext<MyDbContext>(optionns => optionns.UseSqlServer(configuration.GetConnectionString("connectionString")))
.AddSingleton(typeof(ILogger<>), typeof(Logger<>))
.AddLogging()
.BuildServiceProvider();
MyDbContext _context = serviceProvider.GetService<MyDbContext>();
var _logger = serviceProvider.GetService<ILogger<YourClass>>();
如果您想直接在 Autofac 上手动注册 ir,我会推荐一种稍微不同的方法:
private static void ConfigureLogging(ILoggingBuilder log)
{
log.ClearProviders();
log.SetMinimumLevel(LogLevel.Error);
log.AddConsole();
}
private static void ConfigureContainer(ContainerBuilder builder)
{
builder.Register(handler => LoggerFactory.Create(ConfigureLogging))
.As<ILoggerFactory>()
.SingleInstance()
.AutoActivate();
builder.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
// other registrations
}
这是你的主要启动代码:
var containerBuilder = new ContainerBuilder();
ConfigureContainer(containerBuilder);
var container = containerBuilder.Build();
var serviceProvider = new AutofacServiceProvider(container);
// you can use either the built container or set the serviceProvider onto the library you are using.
我们在 ASP.NET 核心应用程序中有共同的 BL 类 进入 ctor:
Microsoft.Extensions.Logging.ILogger<Foo>
在 ASP.NET Core 中,ASP.NET 的内部基础结构通过 LoggerFactory
处理获取 ILogger。
我们现在想在控制台应用程序中重用这些 BL 类(用于异步作业),我们如何设置 AutoFac 和 Serilog 以注入 Microsoft.Extensions.Logging.ILogger<T>
在 LoggerFactory
不存在的环境中?
Microsoft.Extensions.Logging
(参见 source)不是 ASP.NET 核心的一部分,可以 运行 独立于它。您需要做的就是注册 ILoggerFactory
和 ILogger<>
接口。
ILoggerFactory
is used by Logger<T>
实例化实际的记录器。
在控制台应用程序中使用日志扩展时,建议仍然使用 IServiceCollection
,因为这允许您使用 IServiceCollection
extension methods 注册所有支持此功能的包模式。
var services = new ServiceCollection();
services.AddLogging();
// Initialize Autofac
var builder = new ContainerBuilder();
// Use the Populate method to register services which were registered
// to IServiceCollection
builder.Populate(services);
// Build the final container
IContainer container = builder.Build();
这是推荐的方法,因为您不必详细考虑 类 需要为具有 Microsoft.Extensions.DependencyInjection
集成支持的库注册。
当然你也可以手动注册,但是当Microsoft.Extensions.Logging
库发生变化时(添加了新的依赖),你不会得到它,首先必须弄清楚或挖掘into the source code 查找错误。
builder.RegisterType<LoggerFactory>()
.As<ILoggerFactory>()
.SingleInstance();
builder.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
剩下的就是在构建容器之后或应用程序启动之前注册记录器类型:
var loggerFactory = container.Resolve<ILoggerFactory>();
loggerFactory.AddConsole()
.AddSerilog();
并在您的服务中像往常一样注入 ILogger<MyService>
。
在控制台应用 Main 方法中
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
IConfigurationRoot configuration = builder.Build();
var serviceProvider = new ServiceCollection()
.AddDbContext<MyDbContext>(optionns => optionns.UseSqlServer(configuration.GetConnectionString("connectionString")))
.AddSingleton(typeof(ILogger<>), typeof(Logger<>))
.AddLogging()
.BuildServiceProvider();
MyDbContext _context = serviceProvider.GetService<MyDbContext>();
var _logger = serviceProvider.GetService<ILogger<YourClass>>();
如果您想直接在 Autofac 上手动注册 ir,我会推荐一种稍微不同的方法:
private static void ConfigureLogging(ILoggingBuilder log)
{
log.ClearProviders();
log.SetMinimumLevel(LogLevel.Error);
log.AddConsole();
}
private static void ConfigureContainer(ContainerBuilder builder)
{
builder.Register(handler => LoggerFactory.Create(ConfigureLogging))
.As<ILoggerFactory>()
.SingleInstance()
.AutoActivate();
builder.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
// other registrations
}
这是你的主要启动代码:
var containerBuilder = new ContainerBuilder();
ConfigureContainer(containerBuilder);
var container = containerBuilder.Build();
var serviceProvider = new AutofacServiceProvider(container);
// you can use either the built container or set the serviceProvider onto the library you are using.