相关疑难解决方法(0)

ASP.NET Core 中的 Serilog DI,要注入哪个 ILogger 接口?

语境

我已经在我的 ASP.NET Core 应用程序中成功配置了 Serilog,只剩下 DI 部分。

现在我有两个 ILogger 接口,一个Serilog.ILoggerMicrosoft.Extensions.Logging.ILogger. 两者都基于我的 Serilog 配置工作,但我不知道该使用哪个?(我的意思是,在 Serilog 配置到位后Microsoft.Extensions.Logging.ILogger也可以通过 Serilog 正确登录,所以我的配置很荣幸)

如果Microsoft.Extensions.Logging.ILogger我知道如何配置 DI 使其工作。但是,如果Serilog.ILogger我看到 Serilog 有一个静态 Log.Logger 实例(可能是单例)

我不想在我的代码中使用这个静态属性,主要是为了测试的原因,所以我想构造函数注入它。解决方案是:

services.AddSingleton(Log.Logger); // Log.Logger is a singleton anyway
Run Code Online (Sandbox Code Playgroud)

..但是当许多多个线程将同时使用这个非常相同的实例时,我担心 Web 应用程序中的这个单例。它是线程安全的吗?如果不是,那么Serilog.ILogger与 DI一起使用的解决方案是什么?

dependency-injection serilog asp.net-core

9
推荐指数
2
解决办法
4809
查看次数

如何将依赖关系传递给Serilog Enricher?

我在我的应用程序中使用Serilog进行日志记录.当我配置记录器时,我有这样的代码:

var log = new LoggerConfiguration()
    .Enrich.With<MySerilogEnricher>()
    .ReadAppSettings()
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

我想在我的MySerilogEnricher类中注入一些依赖项,但是当我尝试时,我得到了这个编译器错误:

错误CS0310:'SerilogEnricher'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法'LoggerEnrichmentConfiguration.With()'中将其用作参数'TEnricher'

我理解为什么我会收到这个错误,但我看不到一个简单的方法.理想情况下,WithInstance我可以使用这样的电话:

var instance = new MySerilogEnricher(myDependency);
var log = new LoggerConfiguration()
    .Enrich.WithInstance<MySerilogEnricher>(instance)
    .ReadAppSettings()
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

有没有办法将依赖关系传递给MySerilogEnricher?我可能有一个带有MySerilogEnricher的类,并在属性中将依赖项传递给它,但这看起来很混乱.

c# dependency-injection serilog

7
推荐指数
1
解决办法
1467
查看次数

在 ASP.Net Core 中全局设置日志记录范围

我想获取记录在 ASP.Net Core 服务中的每条日志消息上的某些关键信息位(服务名称、服务版本、主机名等)。

我有以下代码:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (host.Services.GetRequiredService<ILogger<Program>>().BeginScope("ServiceName: {0}", "bob-service"))
        {
            host.Run();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(builder =>
            {
                builder.AddConsole(o => o.IncludeScopes = true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
Run Code Online (Sandbox Code Playgroud)

从这里我得到以下日志:

info: Microsoft.Hosting.Lifetime[0]
      => ServiceName: bob-service
      Now listening on: http://localhost:5002

info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[102]
      => ConnectionId:0HLSO8706NGBN => RequestPath:/ RequestId:0HLSO8706NGBN:00000001, SpanId:|aa5794ba-408ad22a63064421., TraceId:aa5794ba-408ad22a63064421, ParentId: => Middleware_Scope => /Index
      Executed handler method OnGet, returned result . …
Run Code Online (Sandbox Code Playgroud)

asp.net-core microsoft-extensions-logging

7
推荐指数
1
解决办法
1663
查看次数

ASP.Net Core ILogger.BeginScope是否可以包装中间件管道

我创建了一个自定义中间件来处理我的Api应用程序中的异常。

我想将请求ID与异常以及我在应用程序中执行的任何其他日志记录相关联。然后,我想处理所有异常,并使用requestId生成的I 响应客户端。

这样一来,他们可以通过与我联系requestId,我可以在日志中查询并查看他们收到错误时的情况。

这是Invoke我的中间件的和requestId响应中的发送。

public async Task Invoke(HttpContext context, ILoggerFactory loggerFactory)
{
    var requestId = Guid.NewGuid();
    var requestScopeLogger = loggerFactory.CreateLogger("AppRequest");

    using (requestScopeLogger.BeginScope("Request {requestId}", requestId))
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex, requestId);
        }
    }
}

private Task HandleExceptionAsync(HttpContext context, Exception exception, Guid requestId)
{
    ...
    var response = JsonConvert.SerializeObject(new { errorMessage = clientResult.message, requestId });

    context.Response.ContentType = "application/json";
    context.Response.StatusCode = (int)clientResult.code;

    return context.Response.WriteAsync(response);
}
Run Code Online (Sandbox Code Playgroud)

中间件先于我的其他组件(StaticFiles,Swagger,Mvc)注册 …

logging asp.net-core

5
推荐指数
0
解决办法
507
查看次数