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

时间:2018-06-06 05:19:38

标签: c# serilog

背景

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

我受到了这种做法的质疑,建议是使用Log类的静态方法,例如Serilog.Log.Debug(...)。争论的焦点是set; Log.Logger,因此嘲弄很容易。

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

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

问题

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

1 个答案:

答案 0 :(得分:5)

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

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

根据您的DI的操作方式,您可能需要在输入中选择ILogger<T>,但是,除非有人需要能够使用工具来获取信息,否则static ILogger _logger = Log.ForContext<MyClass>()是只要Log尽早接线就可以了。