【发布时间】:2019-12-18 23:56:01
【问题描述】:
这里有一个答案:How do I pass a dependency to a Serilog Enricher? 这说明你可以传入一个实例。
但要做到这一点,我需要在我的依赖注入代码运行后移动我的记录器设置(在startup.cs 中)
这意味着不会记录启动错误,因为记录器还没有准备好。
有没有办法以某种方式配置 serilog 以在我的 Main() 方法中运行,但也可以使用 DI 项来丰富数据? DI 项虽然是单例,但有更多的依赖关系(主要是数据库连接)。
我已经用谷歌搜索了这个并阅读了一些关于将内容添加到上下文中的内容,但我一直无法找到一个我可以适应的完整工作示例。
我发现的大多数示例都涉及将代码放入控制器以附加信息,但我希望这对每个日志条目都是全局可用的。
我的 Main 以 :
开头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 注册为单例。
【问题讨论】:
-
查看Inline Initialization - 我认为在这种情况下可以从
hostingContext解决依赖关系。然而,这意味着采取不利的方式让日志记录依赖于 DI 设置(我认为您目前正走在幸福的道路上,在其他任何事情之前设置日志记录 - 也许您应该考虑直接从配置中获取值?) -
更新:
CreateBootstrapLogger()(在this post 中描述)现在完全支持这种情况
标签: dependency-injection asp.net-core-mvc serilog