c# - 使用 Serilog 的模式(通过 ILogger 与使用静态 Serilog.Log)
问题描述
背景
在一个选择Serilog作为记录器的新项目中,我自动开始传递ILogger
接口。代码访问Log.Logger
一次,然后ILogger
通过构造函数注入接受需要记录的类。
我在这种做法上受到了挑战,建议是在Log
课堂上使用静态方法,例如Serilog.Log.Debug(...)
. 争论是有一个set;
onLog.Logger
所以嘲笑很容易。
查看 api 我可以看到传递的好处之一ILogger
是ForContext
方法。
我在网上和Serilog的文档中花了一些时间,但我找不到有关在整个应用程序代码中访问日志的规范方法的信息。
问题
是否有一种规范的,即在大多数情况下更好的方式来访问/传递Serilog记录器,如果有,它是传递ILogger
还是使用Serilog.Log
类上的静态 api?
解决方案
还有一个ForContext
on Log.Logger
,所以我不会在此基础上决定。如果您正在模拟/测试日志记录,您不希望通过单个全局实例来执行此操作。相反,任何将进行日志记录的库代码都应该接受一个ILogger
参数作为输入,使调用者能够检测和/或只是在Log.Logger
他们认为合适的时候传入(不要在Log.Logger
内部添加默认值,原因与具有默认构造函数的原因相同)自动构建您想要从中解耦的依赖项是一个坏主意)。如果您不这样做,您将无法有意义地测试日志输出是否正确(因为最终并行运行的任何并发测试都将写入完全相同的记录器实例),这是一件大事向上。
对我来说,主要的权衡实际上是您是否愿意使用Enrich.FromLogContext
以及将LogContext.*
状态挂在 .NET 上的接口,ExecutionContext
您需要小心不要发疯。(是的,可以说你可以使用一个被隔离的收集器ExecutionContext
来破解我之前的观点,但甚至不要去那里。)
根据您的 DI 的装配方式,您可能想要ILogger<T>
输入您的输入,但同样,除非有人需要能够通过仪器获取信息,static ILogger _logger = Log.ForContext<MyClass>()
只要Log
足够早地连接起来就可以了。
推荐阅读
- java - 如何提取正则表达式的第一部分?
- java - 在 RestAssured JPath 中按名称查找节点
- c# - 如何构建 ac# 代码以使用 REST API 备份表格数据库?
- spring-boot - 保存多个孩子需要太多时间(5 秒 +)
- c# - 嵌入 CMS 签名后签名无效
- javascript - 具有挑战性的递归循环需要展平
- java - 如何在 Vaadin14 中为 Tabs 设置不同的内容?
- nasm - 调用后使用 pop 时的反汇编错误
- python - subprocess.Popen 的 stdin.buffer/stdout 从不刷新
- python - 用非零填充日期转换日期时间字符串