gpt4 book ai didi

dependency-injection - 如何让 serilog 丰富器与依赖注入(inject)一起工作,同时保持启动?

转载 作者:行者123 更新时间:2023-12-03 16:15:36 27 4
gpt4 key购买 nike

这里有答案:How do I pass a dependency to a Serilog Enricher?这说明您可以传入一个实例。

但是要做到这一点,我需要在我的依赖注入(inject)代码运行后移动我的记录器设置(在 startup.cs 中)

这意味着不会记录启动错误,因为记录器还没有准备好。

有没有办法以某种方式配置 serilog 以在我的 Main() 中运行?方法,还可以使用 DI 项来丰富数据?尽管 DI 项是单例,但它具有进一步的依赖关系(主要是数据库连接)。

我已经用谷歌搜索了这个并阅读了一些关于向上下文添加内容的内容,但我一直无法找到一个我可以适应的完整工作示例。

我发现的大多数示例都涉及将代码放入 Controller 以附加信息,但我希望这对每个日志条目都是全局可用的。

我的主要开头是:

Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
{
AutoRegisterTemplate = true,
})
.CreateLogger();

在进入 .NET Core MVC 代码之前
CreateWebHostBuilder(args).Build().Run();
我的 DI 对象基本上是一个“UserData”类,其中包含用户名、公司 ID 等,这些属性是在访问时访问数据库以获取基于某些当前身份的值的属性(尚未实现)。它被我的 DI 注册为单例。

最佳答案

我建议使用插入到 ASP .NET Core 管道中的简单中间件来丰富 Serilog 的 LogContext使用所需的数据,使用所需的依赖项,让 ASP .NET Core 依赖项注入(inject)为您解析依赖项......

例如假设 IUserDataService是一项服务,您可以使用它来获取所需的数据、丰富日志,中间件看起来像这样:

public class UserDataLoggingMiddleware
{
private readonly RequestDelegate _next;

public UserDataLoggingMiddleware(RequestDelegate next)
{
_next = next;
}

public async Task Invoke(HttpContext context, IUserDataService userDataService)
{
var userData = await userDataService.GetAsync();

// Add user data to logging context
using (LogContext.PushProperty("UserData", userData))
{
await _next.Invoke(context);
}
}
}
LogContext.PushProperty上面正在做丰富,添加一个名为 UserData 的属性到当前执行的日志上下文。

ASP .NET Core 负责解析 IUserDataService只要您在 Startup.ConfigureServices 中注册即可.

当然,要使其正常工作,您必须:

1. 通过调用 Enrich.FromLogContext() 告诉 Serilog 从 Log 上下文中丰富日志.例如
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext() // <<======================
.WriteTo.Console(
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} " +
"{Properties:j}{NewLine}{Exception}")
.CreateLogger();

2. 将您的中间件添加到管道中,在您的 Startup.Configure 中.例如
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// ...

app.UseMiddleware<UserDataLoggingMiddleware>();

// ...

app.UseMvc();
}

关于dependency-injection - 如何让 serilog 丰富器与依赖注入(inject)一起工作,同时保持启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57460579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com