小编Pit*_*att的帖子

解构 EF 对象会导致 Serilog 内存不足

我正在为使用实体框架的 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)

c# asp.net-mvc entity-framework serilog

5
推荐指数
1
解决办法
1288
查看次数

标签 统计

asp.net-mvc ×1

c# ×1

entity-framework ×1

serilog ×1