背景
在Serilog被选为记录器的新项目中,我自动开始绕过ILogger
界面.代码访问Log.Logger
一次,从那时起,希望日志记录的类ILogger
通过构造函数注入接受.
我受到了这种做法的挑战,建议是在Log
课堂上使用静态方法,例如Serilog.Log.Debug(...)
.这个论点是,有一set;
对Log.Logger
如此嘲讽是很容易.
看看api,我可以看到传递的好处之一ILogger
就是ForContext
方法.
我花了一些时间在网上和Serilog的文档中,但是我找不到有关在整个应用程序代码中访问日志的规范方法的信息.
题
是否存在规范的,即大多数情况下更好的方式来访问/传递Serilog记录器,如果存在,是否ILogger
在Serilog.Log
类上传递或使用静态API ?
还有一个ForContext
上Log.Logger
,所以我不会在此基础上决定.如果您正在进行模拟/测试日志记录,您不希望通过全局实例执行此操作 - 任何以这种方式进行日志记录的库代码都需要ILogger
输入,允许调用者检测和/或通过在Log.Logger
他们认为合适的.如果你不这样做,测试永远不会并行运行,这是一个很大的放弃.
对我来说,主要的权衡实际上是你是否愿意使用Enrich.FromLogContext
和LogContext.*
接口,这些接口会挂掉.NET ExecutionContext
,你需要小心不要疯狂.(是的,可以说你可以使用一个收集器隔离ExecutionContext
我的前一点,但是甚至不去那里.)
根据你的DI的操作方式,你可能想要ILogger<T>
输入你的输入,但是再次,除非有人需要能够使用仪器来获取信息,static ILogger _logger = Log.ForContext<MyClass>()
只要有Log
足够的时间连接就可以了.