/// <summary> /// Formats a message to and sends it to the writer. /// </summary> /// <param name="message">The message content.</param> /// <param name="logLevel">The mesasge type.</param> /// <param name="showStackTrace">If true includes a stack trace.</param> private void LogMessage(string content, LogLevel level, bool showStackTrace) { // Include a stack trace if desired string stackTrace = null; if (showStackTrace) { string[] lines = Environment.StackTrace.Split(NEW_LINES, StringSplitOptions.RemoveEmptyEntries); StringBuilder sb = new StringBuilder(); for (int i = 0; i < lines.Length; i++) { // Don't include the function calls in the logger in the stack trace, as it is not useful if (i > 2 && !lines[i].Contains(typeof(Logger).FullName)) { sb.AppendLine(lines[i]); } } stackTrace = sb.ToString(); } LogMessage message = new LogMessage(level, content, stackTrace); // Don't write error messages asynchronously as that helps ensure the message is // still logged in case of a fatal error. if (level != LogLevel.Error && WRITE_ASNYCHRONOUSLY) { m_writer.BufferMessage(message); } else { m_writer.WriteSynchronous(message); } }