模式使用Serilog(通过ILogger vs使用静态Serilog.Log)

背景

Serilog被选为记录器的新项目中,我自动开始绕过ILogger接口。 代码访问Log.Logger一次,然后希望记录的类通过构造函数注入接受ILogger

我受到了这种做法的挑战,建议是在Log类上使用静态方法,例如Serilog.Log.Debug(...) 。 争论的焦点是set;Log.Logger所以很容易进行Log.Logger

看看api,我可以看到传递ILogger的好处之一是ForContext方法。

我花了一些时间在网上和Serilog的文档中,但是我找不到有关在整个应用程序代码中访问日志的规范方法的信息。

是否存在规范的,即大多数情况下更好的方式来访问/传递Serilog记录器,如果存在,是否通过ILogger或在Serilog.Log类上使用静态api?

ForContext上还有一个ForContext ,所以我不会在此基础上做出决定。 如果您正在进行日志记录的模拟/测试,您不希望通过全局实例执行此操作 – 任何以这种方式进行日志记录的库代码都需要ILogger作为输入,允许调用者进行检测和/或只是在他们认为合适的情况下传递Log.Logger 。 如果你不这样做,测试永远不会并行运行,这是一个很大的放弃。

对我来说,主要的权衡实际上是你是否愿意使用Enrich.FromLogContextLogContext.*接口,这些接口将.NET ExecutionContext挂起,你需要小心不要发疯。 (是的,可以说你可以使用ExecutionContext中的一个收集器来破解我之前的观点,但是甚至不去那里。)

根据您的DI操作方式,您可能需要在输入中使用ILogger ,但是,除非有人需要使用仪器来获取信息, static ILogger _logger = Log.ForContext()使用static ILogger _logger = Log.ForContext()只要Log足够早就接通, static ILogger _logger = Log.ForContext()就可以了。