2

在 Serilog 中是如何工作的

ILoggerSerilog 中的每一个都有有用的方法,ForContext它基本上创建了完全独立的子记录器,并附加了一些属性。

这对我的情况很有用,当在一个 ASP .NET Core 主机内有 N 个独立的设备 API 运行时,每个 API 都管理一些物理连接的设备。每个 API 都可以拥有它自己的ILogger,其中包含类似的属性DeviceName = "Device1",因此可以在 Seq/Greylog/etc 中设置适当的过滤器。

工作原理 ASP .NET Core 日志记录 API

但是,如果使用ILoggerfrom Microsoft.Extensions.Logging,则该方法没有直接对应物ForContext。据我所知,唯一的选择是BeginScope,不幸的是,它不会创建新的隔离记录器实例,而是将值添加到全局记录器范围。

为了缓解这个问题,使用了 AsyncLocal 和 SynchronizationContext等工具。据我了解,这适用于关联 HTTP 请求之类的事情,因为它们通常具有清晰的异步处理管道。

但是,在我的例子中,每个设备 API 在任务池调度程序上运行一系列有点复杂的 Rx .NET 可观察序列。即使可以保留所有这些SynchronizationContext,这也会引入很多不必要的复杂性。

问题

有没有办法创建独立的记录器和/或记录器工厂,每个都有自己的范围/状态?因此,与 Serilog 类似,任何使用此类记录器的东西都将附加附加属性,而不管调用线程或其他任何东西,但这些属性对应用程序中的任何其他记录器都是不可见的?

还是应该只使用Serilog.ILoggerMicrosoft API 而不是 Microsoft API,因为这个应用程序目前不使用 Web API 功能?

4

0 回答 0