背景
在一个新项目中Serilog被选为记录器,我自动开始传递ILogger
界面。代码访问Log.Logger
从那时起,需要日志记录的类就会接受ILogger
通过构造函数注入。
我在这种做法上受到了挑战,建议是在Log
类,例如Serilog.Log.Debug(...)
。争论是有一个set;
on Log.Logger
所以嘲笑很容易。
查看 api,我可以看到传递的好处之一ILogger
是ForContext
方法。
我花了一些时间在网络和Serilog的文档,但我找不到有关在整个应用程序代码中访问日志的规范方法的信息。
Question
是否有一种规范的,即在大多数情况下更好的方式来访问/传递Serilog记录器,如果有,是否通过ILogger
或使用静态 apiSerilog.Log
class?
还有一个ForContext
on Log.Logger
,所以我不会以此为基础做出决定。如果您正在进行日志记录的模拟/测试,您不想通过单个全局实例来完成此操作。相反,任何将进行日志记录的库代码都应该承认ILogger
参数作为输入,使调用者能够检测和/或只是传入Log.Logger
他们认为合适(不要添加默认值Log.Logger
内部,出于同样的原因,拥有一个默认构造函数来自动构建您想要解耦的依赖项是一个坏主意 https://blogs.cuttingedge.it/steven/posts/2013/di-anti-pattern-multiple-constructors/)。如果不这样做,您将无法有意义地测试日志记录输出是否正确(因为最终并行运行的任何并发测试都将写入完全相同的记录器实例),这是一件大事向上。
对我来说,主要的权衡实际上是你是否愿意使用Enrich.FromLogContext
和LogContext.*
接口,其挂起状态脱离.NETExecutionContext
,你需要小心不要疯狂。 (是的,可以说你可以使用隐藏在ExecutionContext
绕过我之前的观点,但甚至不要去那里。)
根据您的 DI 的操纵方式,您可能需要采取ILogger<T>
在你的输入中,但同样,除非有人需要能够通过仪器来获取信息,否则有一个static ILogger _logger = Log.ForContext<MyClass>()
就可以了,只要Log
接线得够早。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)