private void Write(SourceLevels msgLevel, string msgLevelPrefix, Func <string> getMsg, Exception exception = null)
            {
                if ((Level & msgLevel) != msgLevel)
                {
                    return;
                }

                var ts       = DateTime.Now;
                var threadId = Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture).PadLeft(2);

                var getMessage = new Func <string>(() =>
                {
                    string text;

                    try
                    {
                        text = getMsg();

                        if (exception != null)
                        {
                            text = string.Concat(text, Environment.NewLine, "EXCEPTION: ", exception.ToString());
                        }
                    }
                    catch (Exception e)
                    {
                        text = "Error formatting log message: " + e.Message;
                    }

                    return(string.Format(
                               "{0} {1} {2} {3} {4} {5}",
                               ts.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                               _pid,
                               threadId,
                               msgLevelPrefix,
                               _loggerName,
                               text));
                });

                _writer.Write(getMessage);
            }