Thomas, thank you very much for the speedy answer! The code is very interesting and definitely saved me tons of research type. Here are a few notes:
1. this.destructurers = destructurers ?? DefaultDestructurers; This code does not work as expected. When public constructor for ExceptionEnricher is invoked with no parameters, "destructurers" parameter is not null, but rather empty array, therefore ?? operator causes "destructurers" field to be empty collection (rather than fallback to DefaultDestructurers collection) and as the result ExceptionEnricher does not work at all.
2. data.Add("$Type", exception.GetType().FullName); Here I believe dollar sign supposed to mean stringification (in Serilog sense), but for whatever reason it does not work here and Type property does not get emitted at all. Frankly I don't quite understand why we need stringification here as FullName is the string anyway, so I just removed that dollar sign in my version.
3. Regarding ReflectionBasedDestructurer - I don't understand how it is better than collection of specialized exception destructurers. Could you please explain what problem it solves for you?
4. I noticed that Seq still outputs default exception stack (in the dark red). Wonder how to suppress it, as I'm going to provide better stack through my specialized destructurer.
5. Currently exceptions should be reported through methods like Log.Error(ex, "MessageTemplate"). In many cases people want to just log the exception like Log.Error(ex). In this case event message become empty. I wonder how to create some syntetic (automatic) message for the case when message is not supplied from the data available in exception object. This is more like "food for thought". For the beginning simple ex.Message would do.
Thank you!
Konstantin