/// <summary> /// Renders the XML logging event and appends it to the specified <see cref="StringBuilder" />. /// </summary> /// <param name="builder">The <see cref="StringBuilder"/> to append the rendered data to.</param> /// <param name="logEvent">Logging event.</param> protected internal override void Append(StringBuilder builder, LogEventInfo logEvent) { StringWriter sw = new StringWriter(builder); XmlTextWriter xtw = new XmlTextWriter(sw); if (IndentXml) { xtw.Formatting = Formatting.Indented; } xtw.WriteStartElement("log4j:event"); xtw.WriteAttributeString("logger", logEvent.LoggerName); xtw.WriteAttributeString("level", logEvent.Level.Name.ToUpper()); xtw.WriteAttributeString("timestamp", Convert.ToString((long)(logEvent.TimeStamp.ToUniversalTime() - _log4jDateBase).TotalMilliseconds)); #if !NETCF xtw.WriteAttributeString("thread", NLog.Internal.ThreadIDHelper.Instance.CurrentThreadID.ToString()); #else xtw.WriteElementString("thread", ""); #endif xtw.WriteElementString("log4j:message", logEvent.FormattedMessage); if (IncludeNDC) { xtw.WriteElementString("log4j:NDC", NDC.GetAllMessages(" ")); } #if !NETCF if (IncludeCallSite || IncludeSourceInfo) { System.Diagnostics.StackFrame frame = logEvent.UserStackFrame; MethodBase methodBase = frame.GetMethod(); Type type = methodBase.DeclaringType; xtw.WriteStartElement("log4j:locationinfo"); xtw.WriteAttributeString("class", type.FullName); xtw.WriteAttributeString("method", methodBase.ToString()); if (IncludeSourceInfo) { xtw.WriteAttributeString("file", frame.GetFileName()); xtw.WriteAttributeString("line", frame.GetFileLineNumber().ToString()); } xtw.WriteEndElement(); if (IncludeNLogData) { xtw.WriteElementString("nlog:eventSequenceNumber", logEvent.SequenceID.ToString()); xtw.WriteStartElement("nlog:locationinfo"); xtw.WriteAttributeString("assembly", type.Assembly.FullName); xtw.WriteEndElement(); } } #endif xtw.WriteStartElement("log4j:properties"); if (IncludeMDC) { foreach (System.Collections.DictionaryEntry entry in MDC.GetThreadDictionary()) { xtw.WriteStartElement("log4j:data"); xtw.WriteAttributeString("name", Convert.ToString(entry.Key)); xtw.WriteAttributeString("value", Convert.ToString(entry.Value)); xtw.WriteEndElement(); } } foreach (NLogViewerParameterInfo parameter in Parameters) { xtw.WriteStartElement("log4j:data"); xtw.WriteAttributeString("name", parameter.Name); xtw.WriteAttributeString("value", parameter.CompiledLayout.GetFormattedMessage(logEvent)); xtw.WriteEndElement(); } xtw.WriteStartElement("log4j:data"); xtw.WriteAttributeString("name", "log4japp"); xtw.WriteAttributeString("value", AppInfo); xtw.WriteEndElement(); xtw.WriteStartElement("log4j:data"); xtw.WriteAttributeString("name", "log4jmachinename"); #if NETCF xtw.WriteAttributeString("value", "netcf"); #else xtw.WriteAttributeString("value", NLog.LayoutRenderers.MachineNameLayoutRenderer.MachineName); #endif xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.Flush(); }