public override void Format(TextWriter writer, LoggingEvent loggingEvent) { // check arguments if (loggingEvent == null) return; if (loggingEvent.MessageObject == null && loggingEvent.RenderedMessage == null) return; // get logger id string loggerId = loggingEvent.GetLoggingEventProperty("__objectId"); // prepare stuff string message = loggingEvent.MessageObject == null ? loggingEvent.RenderedMessage : loggingEvent.MessageObject.ToString(); string info = loggingEvent.GetLoggingEventProperty("__extendedInfo"); if (info != null) { message = message + " " + info; } string[] lines = message.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); string header = string.Format("{0} [{1}] ({3}|{4}|{5}) {2} : ", loggingEvent.TimeStamp.ToString("dd-MM-yyyy hh:mm:ss,fff"), loggingEvent.Level.DisplayName.PadLeft(5, ' '), this.LoggerName(loggingEvent.LoggerName), Thread.CurrentThread.GetHashCode().ToString(CultureInfo.InvariantCulture).PadLeft(2, ' '), loggerId.PadLeft(2), Thread.CurrentPrincipal != null ? Thread.CurrentPrincipal.Identity.Name : "unknown"); const string FILLER = "\t"; for (int i = 0; i < lines.Length; i++) { if (i == 0) { writer.Write(header); } else { writer.Write(FILLER); } writer.WriteLine(lines[i]); } }