Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 如何在Serilog接收器中使用依赖项注入?_.net Core_Serilog - Fatal编程技术网

.net core 如何在Serilog接收器中使用依赖项注入?

.net core 如何在Serilog接收器中使用依赖项注入?,.net-core,serilog,.net Core,Serilog,我关注这篇文章 但我需要注射IHttpClientFactory public class MySink : ILogEventSink { //... public MySink(IFormatProvider formatProvider, IHttpClientFactory httpClientFactory) { //... } } public static class MySinkExtensions { public s

我关注这篇文章

但我需要注射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();
    }
}
我可以使用Args注入IHttpClientFactory吗

还是用主要的方法来处理

注意:我使用的是NetCore控制台应用程序

更新:根据

现在,主要的程序是:

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>();
        }
    }
类程序
{
静态异步任务主(字符串[]args)
{
var servicecolection=新servicecolection();
serviceCollection.AddHttpClient();
serviceCollection.AddSingleton(sp=>
{
var httpClientFactory=sp.GetRequiredService();
返回新的LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.myLink(httpClientFactory)
.CreateLogger();
});
serviceCollection.AddLogging(configure=>configure.ClearProviders().AddSerilog());
var serviceProvider=servicecolection.BuildServiceProvider();
Log.Logger=serviceProvider.GetRequiredService();
}
}
我可以在别的班上给伊洛格打电话

class Test
{
    private readonly ILogger<Test> _logger;

    Test(ILogger<Test> logger)
    {
        _logger = logger;
    }
}
类测试
{
专用只读ILogger\u记录器;
测试(ILogger记录器)
{
_记录器=记录器;
}
}
更新:(2020-07-01)

现在,在asp.net核心中,这个提供依赖注入

.UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.SomeSink(services.GetRequiredService<ISomeDependency>()));
.useserlog((主机上下文、服务、日志配置)=>loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()的
.WriteTo.SomeSink(services.GetRequiredService());

我仔细研究了一下,发现在服务提供商构建之后,您可以使用实现工厂来获取
IHttpClientFactory
。您需要更改service.AddLogging(…)调用以使用此工厂实现:

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()
            //.ReadFrom.Configuration(Configuration)
            .WriteTo.MySink(httpClientFactory)
            .CreateLogger();
    });

    serviceCollection.AddLogging(cfg =>
    {
        cfg.ClearProviders().AddSerilog();
    });


    var serviceProvider = serviceCollection.BuildServiceProvider();


    var logger = serviceProvider.GetService<Serilog.ILogger>();

    logger.Debug("Working");
}
static async Task Main(字符串[]args)
{
var servicecolection=新servicecolection();
serviceCollection.AddHttpClient();
serviceCollection.AddSingleton(sp=>
{
var httpClientFactory=sp.GetRequiredService();
返回新的LoggerConfiguration()
.MinimumLevel.Debug()
//.ReadFrom.Configuration(配置)
.WriteTo.myLink(httpClientFactory)
.CreateLogger();
});
serviceCollection.AddLogging(cfg=>
{
cfg.ClearProviders().AddSerilog();
});
var serviceProvider=servicecolection.BuildServiceProvider();
var logger=serviceProvider.GetService();
logger.Debug(“工作”);
}
在代码示例中,我们可以使用工厂实现的
AddSingleton
仅在首次请求时创建记录器。这允许我们从服务提供者中提取任何已注册的服务,并将它们注入到我们的类中。在本例中,我们获取
IHttpClientFactory
,并将其注入
MySink


如果您在
var logger=serviceProvider.GetService()
行上放置断点,当您进入该行时,它将在
AddSingleton
中调用lambda并为您创建记录器。

为什么需要插入
IHttpClientFactory
?对于接收器,您只需传入配置选项,例如URL等,因为接收器知道需要创建什么,即HttpClient才能正常工作。如果您查看的代码,您可以看到它们传入URI,但接收器本身创建了客户端-因为我发现HttpClient存在一些问题。在这种情况下,您可以在接收器中使用
new HttpClientFactory()
,并调用它来创建您的客户端吗?我无法新建HttpClientFactory。IHttpClientFactory由DefaultHttpClientFactory()实现,是一个内部类。
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()
            //.ReadFrom.Configuration(Configuration)
            .WriteTo.MySink(httpClientFactory)
            .CreateLogger();
    });

    serviceCollection.AddLogging(cfg =>
    {
        cfg.ClearProviders().AddSerilog();
    });


    var serviceProvider = serviceCollection.BuildServiceProvider();


    var logger = serviceProvider.GetService<Serilog.ILogger>();

    logger.Debug("Working");
}