using System;
using System.Text;
namespace MediaBrowser.Model.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]);
}
}
}
}