【发布时间】:2022-02-24 18:49:57
【问题描述】:
我关注这篇文章。 Developing a sink
但我需要注入 IHttpClientFactory。
public class MySink : ILogEventSink
{
//...
public MySink(IFormatProvider formatProvider, IHttpClientFactory httpClientFactory)
{
//...
}
}
public static class MySinkExtensions
{
public static LoggerConfiguration MySink(
this LoggerSinkConfiguration loggerConfiguration,
IHttpClientFactory httpClientFactory,
IFormatProvider formatProvider = null,
LogEventLevel restrictedToMinimumLevel = LogEventLevel.Verbose)
{
return loggerConfiguration.Sink(new MySink(formatProvider, httpClientFactory), restrictedToMinimumLevel);
}
}
主程序:
class Program
{
static async Task Main(string[] args)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddHttpClient();
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.WriteTo.MySink(null) //<--How to get IHttpClientFactory?
.CreateLogger();
services.AddLogging(configure => configure.ClearProviders().AddSerilog(logger));
var serviceProvider = services.BuildServiceProvider();
}
}
应用设置:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "MyTestProject" ],
"WriteTo": [
{
"Name": "Console",
"Args": {
"restrictedToMinimumLevel": "Debug"
}
},
{
"Name": "MySink",
"Args": {
"restrictedToMinimumLevel": "Warning"
}
}
]
}
我可以使用 Args 来注入 IHttpClientFactory 吗?
或者在 Main 方法中处理这个?
注意:我正在使用 net core 控制台应用程序。
更新:根据asnwer
现在,主程序是:
class Program
{
static async Task Main(string[] args)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddHttpClient();
serviceCollection.AddSingleton<Serilog.ILogger>(sp =>
{
var httpClientFactory = sp.GetRequiredService<IHttpClientFactory>();
return new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.MySink(httpClientFactory)
.CreateLogger();
});
serviceCollection.AddLogging(configure => configure.ClearProviders().AddSerilog());
var serviceProvider = serviceCollection.BuildServiceProvider();
Log.Logger = serviceProvider.GetRequiredService<Serilog.ILogger>();
}
}
我可以在其他类中注入 ILogger
class Test
{
private readonly ILogger<Test> _logger;
Test(ILogger<Test> logger)
{
_logger = logger;
}
}
更新:(2020-07-01)
现在,在 asp net core 中,这个 package 提供依赖注入。
.UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.SomeSink(services.GetRequiredService<ISomeDependency>()));
【问题讨论】:
-
为什么需要注入
IHttpClientFactory?对于接收器,您只需传递配置选项,例如一个 URL 等,因为接收器会知道它需要创建什么,即一个 HttpClient,才能运行。如果您查看Elastic Search Sink 的代码,您可以看到它们传递了 URI,但接收器会自行创建客户端 - ElasticLowLevelClient -
因为我发现 HttpClient 有问题。Issues with the original HttpClient class available in .NET Core.
-
在这种情况下,您可以在接收器中使用
new HttpClientFactory()并调用它来创建您的客户端吗? -
我不能新建 HttpClientFactory。 IHttpClientFactory由DefaultHttpClientFactory(DefaultHttpClientFactory)实现,是一个内部类。