我正在为一个使用Entity Framework的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);
Serilog尝试懒加载整个数据库,应用程序将挂起一分钟并崩溃。Serilog日志文件将报告OutOfMemoryException
如何防止其他开发人员意外执行以下操作并导致意外的挂起/崩溃?
if(veryRarelyOccuringEvent)
Log.Information("Supplier {@supplier} just did something, supplier)
我所做的是使用解构策略来防止所有解构操作,我宁愿开发人员显式地声明一个ToString方法,而不是使用@。当然,我们可以决定不使用@运算符,但如果有人忘记了并且应用程序因此崩溃怎么办呢?在代码审查中很容易忽略@。我不想构建一个Serilog操作包装器仅仅为了防止使用@。
以下内容将防止使用@运算符:
Log.Logger = new LoggerConfiguration()
.Destructure.With<PreventDestructure>()
...
将只返回{}。但是,除了下面的代码,还有更简单的方法吗?
public class PreventDestructure : IDestructuringPolicy {
public bool TryDestructure(
object value,
ILogEventPropertyValueFactory propertyValueFactory,
out LogEventPropertyValue result) {
List<LogEventProperty> fieldsWithValues;
fieldsWithValues = new List<LogEventProperty>();
result = new StructureValue(fieldsWithValues);
return true;
}
}
第二个问题:有没有办法指示Serilog在日志事件中花费最长XXX毫秒?如果我使用数据库 sink 并且数据库脱机了怎么办?如果我使用 AI sink,但无法连接 ApplicationInsights 等情况呢?