是否可以在Serilog.Exceptions中禁用基于反射的解构器? - c#

软件包Serilog.Exceptions非常适合记录异常。它具有大量受支持的异常类型列表。

例如当前设置:

Log.Logger = new LoggerConfiguration()
    .Enrich.WithExceptionDetails()
    .CreateLogger();

当前,如果找不到异常类型的解构器,则它会退回到“基于反射的解构器”。

由于性能,但更重要的是可预测性,我们希望禁用反射回退。

我尝试使用DestructuringOptions进行配置,例如禁用一些默认的析构函数或将DestructuringDepth设置为0

不幸的是,这些选项不起作用:

ReflectionBasedDestructurer不在默认析构函数列表中
不允许将DestructuringDepth设置为0(例外)

任何想法如何为此配置Serilog.Exceptions吗?

参考方案

我认为您最好的选择是实现自己的ExceptionDecostructor,如下所示:

 public class FallbackExceptionDestructurer : ExceptionDestructurer
 {
        public override Type[] TargetTypes => new[]
        {
            typeof(Exception),
        };

        public override void Destructure(
            Exception exception,
            IExceptionPropertiesBag propertiesBag,
            Func<Exception, IReadOnlyDictionary<string, object>> destructureException)
        {
            base.Destructure(exception, propertiesBag, destructureException);
        }
 }

这样,您将保留所有可用的析构函数,并且基于反射的将被忽略,因为FallbackExceptionDestructurer将覆盖由于以下代码而导致的所有未知异常:

public override Type[] TargetTypes => new[]
{
  typeof(Exception),
};

这就是您注册解构器的方式

.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
    .WithDefaultDestructurers()
    .WithDestructurers(new[] { new FallbackExceptionDestructurer () }))

如果检查ExceptionDestructurer.Decostruct(...)的源代码,则不会使用任何反射-只会使用Exception类型的众所周知的属性。

Serilog Net Core其他专栏问题 - c#

我正在将Serilog SQL Server Sink用于.NET Core 2。我已经在Serilog.Logger和Program.cs中都配置了Startup.cs,如下所示:ColumnOptions columnOptions = new ColumnOptions(); columnOptions.AdditionalDataColumns = …

捕获处理的异常 - c#

嘿:)有什么办法可以全局捕获已处理的异常吗?我知道我们可以使用“ AppDomain.CurrentDomain.UnhandledException”和“ Application.ThreadException”捕获未处理的异常,但是我想对已经捕获的异常进行一些处理(例如写入日志等)谢谢 参考方案 通常,您可能希望在代码的最低级别捕获异常。相对于异常发生的…

为什么不在生产中启用Symfony调试工具? - php

我经常发现将php错误转换为将回调注册到set_error_handler和register_shutdown_function的异常非常有用,因此我决定尝试一些更可靠的解决方案,即Symfony Debug组件。但是,它们在introduction page中警告: 您永远不要在生产环境中启用调试工具,因为它们可能会向用户泄露敏感信息。启用调试组件基本上意…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…