using System; using System.Text; namespace MediaBrowser.Common.Implementations.Logging { /// /// Class LogHelper /// public static class LogHelper { /// /// Gets the log message. /// /// The exception. /// StringBuilder. public static StringBuilder GetLogMessage(Exception exception) { if (exception == null) { throw new ArgumentNullException("exception"); } var messageText = new StringBuilder(); messageText.AppendLine(exception.Message); messageText.AppendLine(exception.GetType().FullName); LogExceptionData(messageText, exception); messageText.AppendLine(exception.StackTrace ?? "No Stack Trace Available"); // Log the InnerExceptions, if any AppendInnerExceptions(messageText, exception); messageText.AppendLine(string.Empty); return messageText; } /// /// Appends the inner exceptions. /// /// The message text. /// The e. private static void AppendInnerExceptions(StringBuilder messageText, Exception e) { var aggregate = e as AggregateException; if (aggregate != null && aggregate.InnerExceptions != null) { foreach (var ex in aggregate.InnerExceptions) { AppendInnerException(messageText, ex); AppendInnerExceptions(messageText, ex); } } else if (e.InnerException != null) { AppendInnerException(messageText, e.InnerException); AppendInnerExceptions(messageText, e.InnerException); } } /// /// Appends the inner exception. /// /// The message text. /// The e. private static void AppendInnerException(StringBuilder messageText, Exception e) { messageText.AppendLine("InnerException: " + e.GetType().FullName); messageText.AppendLine(e.Message); LogExceptionData(messageText, e); if (e.StackTrace != null) { messageText.AppendLine(e.StackTrace); } } /// /// Logs the exception data. /// /// The message text. /// The e. private static void LogExceptionData(StringBuilder messageText, Exception e) { foreach (var key in e.Data.Keys) { messageText.AppendLine(key + ": " + e.Data[key]); } } } }