From 54cb3c04324f259fdbc321567f19feb66b91a90c Mon Sep 17 00:00:00 2001 From: Chris Cameron Date: Tue, 20 Mar 2018 10:59:09 -0400 Subject: [PATCH] Better logging of aggregate exceptions --- .../Services/Logging/ILoggerService.cs | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/ICD.Common.Utils/Services/Logging/ILoggerService.cs b/ICD.Common.Utils/Services/Logging/ILoggerService.cs index 3a0f1c1..b7f1a53 100644 --- a/ICD.Common.Utils/Services/Logging/ILoggerService.cs +++ b/ICD.Common.Utils/Services/Logging/ILoggerService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text; using ICD.Common.Properties; namespace ICD.Common.Utils.Services.Logging @@ -94,19 +95,50 @@ namespace ICD.Common.Utils.Services.Logging #if STANDARD if (e is AggregateException) { - AggregateException aggregate = e as AggregateException; - // We want the stack trace from the aggregate exception but the type and message from the inner. - foreach (Exception inner in aggregate.InnerExceptions) - extends.AddEntry(severity, string.Format("{0}: {1}{2}{3}{2}{4}", inner.GetType().Name, message, - IcdEnvironment.NewLine, inner.Message, e.StackTrace)); + extends.AddEntry(severity, e as AggregateException, message); return; } #endif - extends.AddEntry(severity, string.Format("{0}: {1}{2}{3}{2}{4}", e.GetType().Name, message, IcdEnvironment.NewLine, e.Message, e.StackTrace)); } +#if STANDARD + /// + /// Logs an aggregate exception as a formatted list of inner exceptions. + /// + /// + /// + /// + /// + private static void AddEntry(this ILoggerService extends, eSeverity severity, AggregateException e, string message) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (e == null) + throw new ArgumentNullException("e"); + + StringBuilder builder = new StringBuilder(); + + builder.AppendFormat("{0}: {1}", e.GetType().Name, message); + + builder.Append(IcdEnvironment.NewLine); + builder.Append('['); + + foreach (Exception inner in e.Flatten().InnerExceptions) + builder.AppendFormat("{0}\t{1}: {2}", IcdEnvironment.NewLine, inner.GetType().Name, inner.Message); + + builder.Append(IcdEnvironment.NewLine); + builder.Append(']'); + + builder.Append(IcdEnvironment.NewLine); + builder.Append(e.StackTrace); + + extends.AddEntry(severity, builder.ToString()); + } +#endif + [PublicAPI] public static void AddEntry(this ILoggerService extends, eSeverity severity, Exception e, string message, params object[] args)