我正在为使用实体框架的 SaaS 应用程序测试 Serilog。我注意到如果尚未处理加载对象的上下文,Serilog 无法处理解构 EF 对象。
Supplier supplier = context.Supplier.Find(6100);
Log.Information("This works and the cost for ToString() is negligible {supp}", supplier);
Log.Fatal("This will cause an Out of Memory error {@supp}", supplier);
Run Code Online (Sandbox Code Playgroud)
Serilog 将尝试延迟加载整个数据库,应用程序将挂起一分钟并崩溃。Serilog 日志文件将报告 OutOfMemoryException
如何防止其他开发人员不小心执行以下操作并导致意外挂起/崩溃?
if(veryRarelyOccuringEvent)
Log.Information("Supplier {@supplier} just did something, supplier)
Run Code Online (Sandbox Code Playgroud)
我所做的是使用解构策略来防止所有解构,我宁愿让开发人员明确声明 ToString 方法而不是使用 @。当然,我们可以决定不使用@-operator,但是如果有人忘记了并且应用程序因此而崩溃怎么办?@ 在代码审查中很容易错过。我不想为 Serilog 操作构造一个包装器只是为了防止使用 @。
以下将阻止使用@-operator:
Log.Logger = new LoggerConfiguration()
.Destructure.With<PreventDestructure>()
...
Run Code Online (Sandbox Code Playgroud)
并且只会返回 {}。但是有没有比下面的代码更简单的方法?
public class PreventDestructure : IDestructuringPolicy {
public bool TryDestructure(
object value,
ILogEventPropertyValueFactory propertyValueFactory,
out LogEventPropertyValue result) {
List<LogEventProperty> fieldsWithValues; …Run Code Online (Sandbox Code Playgroud)