private void AppendNdc(XmlWriter xtw) { string ndcContent = null; if (IncludeNdc) { ndcContent = string.Join(NdcItemSeparator, NestedDiagnosticsContext.GetAllMessages()); } #if !SILVERLIGHT if (IncludeNdlc) { if (ndcContent != null) { //extra separator ndcContent += NdcItemSeparator; } ndcContent += string.Join(NdlcItemSeparator, NestedDiagnosticsLogicalContext.GetAllMessages()); } #endif if (ndcContent != null) { //NDLC and NDC should be in the same element xtw.WriteElementSafeString("log4j", "NDC", dummyNamespace, ndcContent); } }
/// <summary> /// Renders the specified Nested Diagnostics Context item 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 override void Append(StringBuilder builder, LogEventInfo logEvent) { string[] messages = NestedDiagnosticsContext.GetAllMessages(); int startPos = 0; int endPos = messages.Length; if (this.TopFrames != -1) { endPos = Math.Min(this.TopFrames, messages.Length); } else if (this.BottomFrames != -1) { startPos = messages.Length - Math.Min(this.BottomFrames, messages.Length); } int totalLength = 0; int separatorLength = 0; for (int i = endPos - 1; i >= startPos; --i) { totalLength += separatorLength + messages[i].Length; separatorLength = this.Separator.Length; } string separator = string.Empty; StringBuilder sb = new StringBuilder(); for (int i = endPos - 1; i >= startPos; --i) { sb.Append(separator); sb.Append(messages[i]); separator = this.Separator; } builder.Append(sb.ToString()); }
/// <summary> /// Renders the specified Nested Diagnostics Context item 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 override void Append(StringBuilder builder, LogEventInfo logEvent) { var messages = NestedDiagnosticsContext.GetAllMessages(); var startPos = 0; var endPos = messages.Length; if (TopFrames != -1) { endPos = Math.Min(TopFrames, messages.Length); } else if (BottomFrames != -1) { startPos = messages.Length - Math.Min(BottomFrames, messages.Length); } var totalLength = 0; var separatorLength = 0; for (var i = endPos - 1; i >= startPos; --i) { totalLength += separatorLength + messages[i].Length; separatorLength = Separator.Length; } var separator = string.Empty; var sb = new StringBuilder(); for (var i = endPos - 1; i >= startPos; --i) { sb.Append(separator); sb.Append(messages[i]); separator = Separator; } builder.Append(sb); }
/// <summary> /// Renders the specified Nested Diagnostics Context item 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 override void Append(StringBuilder builder, LogEventInfo logEvent) { string[] messages = NestedDiagnosticsContext.GetAllMessages(logEvent.FormatProvider); int startPos = 0; int endPos = messages.Length; if (this.TopFrames != -1) { endPos = Math.Min(this.TopFrames, messages.Length); } else if (this.BottomFrames != -1) { startPos = messages.Length - Math.Min(this.BottomFrames, messages.Length); } string separator = string.Empty; for (int i = endPos - 1; i >= startPos; --i) { builder.Append(separator); builder.Append(messages[i]); separator = this.Separator; } }
/// <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 override void Append(StringBuilder builder, LogEventInfo logEvent) { var settings = new XmlWriterSettings { Indent = this.IndentXml, ConformanceLevel = ConformanceLevel.Fragment, IndentChars = " ", }; var sb = new StringBuilder(); using (XmlWriter xtw = XmlWriter.Create(sb, settings)) { xtw.WriteStartElement("log4j", "event", dummyNamespace); xtw.WriteAttributeSafeString("xmlns", "nlog", null, dummyNLogNamespace); xtw.WriteAttributeSafeString("logger", logEvent.LoggerName); xtw.WriteAttributeSafeString("level", logEvent.Level.Name.ToUpper(CultureInfo.InvariantCulture)); xtw.WriteAttributeSafeString("timestamp", Convert.ToString((long)(logEvent.TimeStamp.ToUniversalTime() - log4jDateBase).TotalMilliseconds, CultureInfo.InvariantCulture)); xtw.WriteAttributeSafeString("thread", System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture)); xtw.WriteElementSafeString("log4j", "message", dummyNamespace, logEvent.FormattedMessage); if (logEvent.Exception != null) { xtw.WriteElementSafeString("log4j", "throwable", dummyNamespace, logEvent.Exception.ToString()); } if (this.IncludeNdc) { xtw.WriteElementSafeString("log4j", "NDC", dummyNamespace, string.Join(this.NdcItemSeparator, NestedDiagnosticsContext.GetAllMessages())); } if (logEvent.Exception != null) { xtw.WriteStartElement("log4j", "throwable", dummyNamespace); xtw.WriteSafeCData(logEvent.Exception.ToString()); xtw.WriteEndElement(); } if (this.IncludeCallSite || this.IncludeSourceInfo) { System.Diagnostics.StackFrame frame = logEvent.UserStackFrame; if (frame != null) { MethodBase methodBase = frame.GetMethod(); Type type = methodBase.DeclaringType; xtw.WriteStartElement("log4j", "locationInfo", dummyNamespace); if (type != null) { xtw.WriteAttributeSafeString("class", type.FullName); } xtw.WriteAttributeSafeString("method", methodBase.ToString()); #if !SILVERLIGHT if (this.IncludeSourceInfo) { xtw.WriteAttributeSafeString("file", frame.GetFileName()); xtw.WriteAttributeSafeString("line", frame.GetFileLineNumber().ToString(CultureInfo.InvariantCulture)); } #endif xtw.WriteEndElement(); if (this.IncludeNLogData) { xtw.WriteElementSafeString("nlog", "eventSequenceNumber", dummyNLogNamespace, logEvent.SequenceID.ToString(CultureInfo.InvariantCulture)); xtw.WriteStartElement("nlog", "locationInfo", dummyNLogNamespace); if (type != null) { xtw.WriteAttributeSafeString("assembly", type.Assembly.FullName); } xtw.WriteEndElement(); xtw.WriteStartElement("nlog", "properties", dummyNLogNamespace); foreach (var contextProperty in logEvent.Properties) { xtw.WriteStartElement("nlog", "data", dummyNLogNamespace); xtw.WriteAttributeSafeString("name", Convert.ToString(contextProperty.Key, CultureInfo.InvariantCulture)); xtw.WriteAttributeSafeString("value", Convert.ToString(contextProperty.Value, CultureInfo.InvariantCulture)); xtw.WriteEndElement(); } xtw.WriteEndElement(); } } } xtw.WriteStartElement("log4j", "properties", dummyNamespace); if (this.IncludeMdc) { foreach (KeyValuePair <string, object> entry in MappedDiagnosticsContext.ThreadDictionary) { xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", entry.Key); xtw.WriteAttributeSafeString("value", String.Format(logEvent.FormatProvider, "{0}", entry.Value)); xtw.WriteEndElement(); } } foreach (NLogViewerParameterInfo parameter in this.Parameters) { xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", parameter.Name); xtw.WriteAttributeSafeString("value", parameter.Layout.Render(logEvent)); xtw.WriteEndElement(); } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", "log4japp"); xtw.WriteAttributeSafeString("value", this.AppInfo); xtw.WriteEndElement(); xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", "log4jmachinename"); #if SILVERLIGHT xtw.WriteAttributeSafeString("value", "silverlight"); #else xtw.WriteAttributeSafeString("value", Environment.MachineName); #endif xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.Flush(); // get rid of 'nlog' and 'log4j' namespace declarations sb.Replace(" xmlns:log4j=\"" + dummyNamespace + "\"", string.Empty); sb.Replace(" xmlns:nlog=\"" + dummyNLogNamespace + "\"", string.Empty); builder.Append(sb.ToString()); } }
/// <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 override void Append(StringBuilder builder, LogEventInfo logEvent) { StringBuilder sb = new StringBuilder(); using (XmlWriter xtw = XmlWriter.Create(sb, this.xmlWriterSettings)) { xtw.WriteStartElement("log4j", "event", dummyNamespace); xtw.WriteAttributeSafeString("xmlns", "nlog", null, dummyNLogNamespace); xtw.WriteAttributeSafeString("logger", logEvent.LoggerName); xtw.WriteAttributeSafeString("level", logEvent.Level.Name.ToUpper(CultureInfo.InvariantCulture)); xtw.WriteAttributeSafeString("timestamp", Convert.ToString((long)(logEvent.TimeStamp.ToUniversalTime() - log4jDateBase).TotalMilliseconds, CultureInfo.InvariantCulture)); xtw.WriteAttributeSafeString("thread", System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture)); xtw.WriteElementSafeString("log4j", "message", dummyNamespace, logEvent.FormattedMessage); if (logEvent.Exception != null) { xtw.WriteElementSafeString("log4j", "throwable", dummyNamespace, logEvent.Exception.ToString()); } if (this.IncludeNdc) { xtw.WriteElementSafeString("log4j", "NDC", dummyNamespace, string.Join(this.NdcItemSeparator, NestedDiagnosticsContext.GetAllMessages())); } if (logEvent.Exception != null) { xtw.WriteStartElement("log4j", "throwable", dummyNamespace); xtw.WriteSafeCData(logEvent.Exception.ToString()); xtw.WriteEndElement(); } if (this.IncludeCallSite || this.IncludeSourceInfo) { System.Diagnostics.StackFrame frame = logEvent.UserStackFrame; if (frame != null) { MethodBase methodBase = frame.GetMethod(); Type type = methodBase.DeclaringType; xtw.WriteStartElement("log4j", "locationInfo", dummyNamespace); if (type != null) { xtw.WriteAttributeSafeString("class", type.FullName); } xtw.WriteAttributeSafeString("method", methodBase.ToString()); #if !SILVERLIGHT if (this.IncludeSourceInfo) { xtw.WriteAttributeSafeString("file", frame.GetFileName()); xtw.WriteAttributeSafeString("line", frame.GetFileLineNumber().ToString(CultureInfo.InvariantCulture)); } #endif xtw.WriteEndElement(); if (this.IncludeNLogData) { xtw.WriteElementSafeString("nlog", "eventSequenceNumber", dummyNLogNamespace, logEvent.SequenceID.ToString(CultureInfo.InvariantCulture)); xtw.WriteStartElement("nlog", "locationInfo", dummyNLogNamespace); if (type != null) { xtw.WriteAttributeSafeString("assembly", type.Assembly.FullName); } xtw.WriteEndElement(); xtw.WriteStartElement("nlog", "properties", dummyNLogNamespace); AppendProperties("nlog", xtw, logEvent); xtw.WriteEndElement(); } } } xtw.WriteStartElement("log4j", "properties", dummyNamespace); if (this.IncludeMdc) { foreach (string key in MappedDiagnosticsContext.GetNames()) { string propertyValue = XmlHelper.XmlConvertToString(MappedDiagnosticsContext.GetObject(key)); if (propertyValue == null) { continue; } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", key); xtw.WriteAttributeSafeString("value", propertyValue); xtw.WriteEndElement(); } } #if !SILVERLIGHT if (this.IncludeMdlc) { foreach (string key in MappedDiagnosticsLogicalContext.GetNames()) { string propertyValue = XmlHelper.XmlConvertToString(MappedDiagnosticsLogicalContext.GetObject(key)); if (propertyValue == null) { continue; } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", key); xtw.WriteAttributeSafeString("value", propertyValue); xtw.WriteEndElement(); } } #endif if (this.IncludeAllProperties) { AppendProperties("log4j", xtw, logEvent); } if (this.Parameters.Count > 0) { foreach (NLogViewerParameterInfo parameter in this.Parameters) { xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", parameter.Name); xtw.WriteAttributeSafeString("value", parameter.Layout.Render(logEvent)); xtw.WriteEndElement(); } } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", "log4japp"); xtw.WriteAttributeSafeString("value", this.AppInfo); xtw.WriteEndElement(); xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", "log4jmachinename"); xtw.WriteAttributeSafeString("value", this.machineName); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.Flush(); // get rid of 'nlog' and 'log4j' namespace declarations sb.Replace(dummyNamespaceRemover, string.Empty); sb.Replace(dummyNLogNamespaceRemover, string.Empty); builder.Append(sb.ToString()); // StringBuilder.Replace is not good when reusing the StringBuilder } }
/// <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 override void Append(StringBuilder builder, LogEventInfo logEvent) { StringBuilder sb = new StringBuilder(); using (XmlWriter xtw = XmlWriter.Create(sb, _xmlWriterSettings)) { xtw.WriteStartElement("log4j", "event", dummyNamespace); xtw.WriteAttributeSafeString("xmlns", "nlog", null, dummyNLogNamespace); xtw.WriteAttributeSafeString("logger", LoggerName != null ? LoggerName.Render(logEvent) : logEvent.LoggerName); xtw.WriteAttributeSafeString("level", logEvent.Level.Name.ToUpperInvariant()); xtw.WriteAttributeSafeString("timestamp", Convert.ToString((long)(logEvent.TimeStamp.ToUniversalTime() - log4jDateBase).TotalMilliseconds, CultureInfo.InvariantCulture)); xtw.WriteAttributeSafeString("thread", System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture)); xtw.WriteElementSafeString("log4j", "message", dummyNamespace, logEvent.FormattedMessage); if (logEvent.Exception != null) { // TODO Why twice the exception details? xtw.WriteElementSafeString("log4j", "throwable", dummyNamespace, logEvent.Exception.ToString()); } string ndcContent = null; if (IncludeNdc) { ndcContent = string.Join(NdcItemSeparator, NestedDiagnosticsContext.GetAllMessages()); } #if !SILVERLIGHT if (IncludeNdlc) { if (ndcContent != null) { //extra separator ndcContent += NdcItemSeparator; } ndcContent += string.Join(NdlcItemSeparator, NestedDiagnosticsLogicalContext.GetAllMessages()); } #endif if (ndcContent != null) { //NDLC and NDC should be in the same element xtw.WriteElementSafeString("log4j", "NDC", dummyNamespace, ndcContent); } if (logEvent.Exception != null) { // TODO Why twice the exception details? xtw.WriteStartElement("log4j", "throwable", dummyNamespace); xtw.WriteSafeCData(logEvent.Exception.ToString()); xtw.WriteEndElement(); } if (IncludeCallSite || IncludeSourceInfo) { if (logEvent.CallSiteInformation != null) { MethodBase methodBase = logEvent.CallSiteInformation.GetCallerStackFrameMethod(0); string callerClassName = logEvent.CallSiteInformation.GetCallerClassName(methodBase, true, true, true); string callerMemberName = logEvent.CallSiteInformation.GetCallerMemberName(methodBase, true, true, true); xtw.WriteStartElement("log4j", "locationInfo", dummyNamespace); if (!string.IsNullOrEmpty(callerClassName)) { xtw.WriteAttributeSafeString("class", callerClassName); } xtw.WriteAttributeSafeString("method", callerMemberName); #if !SILVERLIGHT if (IncludeSourceInfo) { xtw.WriteAttributeSafeString("file", logEvent.CallSiteInformation.GetCallerFilePath(0)); xtw.WriteAttributeSafeString("line", logEvent.CallSiteInformation.GetCallerLineNumber(0).ToString(CultureInfo.InvariantCulture)); } #endif xtw.WriteEndElement(); if (IncludeNLogData) { xtw.WriteElementSafeString("nlog", "eventSequenceNumber", dummyNLogNamespace, logEvent.SequenceID.ToString(CultureInfo.InvariantCulture)); xtw.WriteStartElement("nlog", "locationInfo", dummyNLogNamespace); var type = methodBase?.DeclaringType; if (type != null) { xtw.WriteAttributeSafeString("assembly", type.GetAssembly().FullName); } xtw.WriteEndElement(); xtw.WriteStartElement("nlog", "properties", dummyNLogNamespace); AppendProperties("nlog", xtw, logEvent); xtw.WriteEndElement(); } } } xtw.WriteStartElement("log4j", "properties", dummyNamespace); if (IncludeMdc) { foreach (string key in MappedDiagnosticsContext.GetNames()) { string propertyValue = XmlHelper.XmlConvertToString(MappedDiagnosticsContext.GetObject(key)); if (propertyValue == null) { continue; } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", key); xtw.WriteAttributeSafeString("value", propertyValue); xtw.WriteEndElement(); } } #if !SILVERLIGHT if (IncludeMdlc) { foreach (string key in MappedDiagnosticsLogicalContext.GetNames()) { string propertyValue = XmlHelper.XmlConvertToString(MappedDiagnosticsLogicalContext.GetObject(key)); if (propertyValue == null) { continue; } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", key); xtw.WriteAttributeSafeString("value", propertyValue); xtw.WriteEndElement(); } } #endif if (IncludeAllProperties) { AppendProperties("log4j", xtw, logEvent); } if (Parameters.Count > 0) { foreach (NLogViewerParameterInfo parameter in Parameters) { xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", parameter.Name); xtw.WriteAttributeSafeString("value", parameter.Layout.Render(logEvent)); xtw.WriteEndElement(); } } xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", "log4japp"); xtw.WriteAttributeSafeString("value", AppInfo); xtw.WriteEndElement(); xtw.WriteStartElement("log4j", "data", dummyNamespace); xtw.WriteAttributeSafeString("name", "log4jmachinename"); xtw.WriteAttributeSafeString("value", _machineName); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.Flush(); // get rid of 'nlog' and 'log4j' namespace declarations sb.Replace(dummyNamespaceRemover, string.Empty); sb.Replace(dummyNLogNamespaceRemover, string.Empty); builder.Append(sb.ToString()); // StringBuilder.Replace is not good when reusing the StringBuilder } }
public void NDCTest1() { List <Exception> exceptions = new List <Exception>(); ManualResetEvent mre = new ManualResetEvent(false); int counter = 500; int remaining = counter; for (int i = 0; i < counter; ++i) { ThreadPool.QueueUserWorkItem( s => { try { NestedDiagnosticsContext.Clear(); Assert.AreEqual(string.Empty, NestedDiagnosticsContext.TopMessage); Assert.AreEqual(string.Empty, NestedDiagnosticsContext.Pop()); AssertContents(NestedDiagnosticsContext.GetAllMessages()); using (NestedDiagnosticsContext.Push("foo")) { Assert.AreEqual("foo", NestedDiagnosticsContext.TopMessage); AssertContents(NestedDiagnosticsContext.GetAllMessages(), "foo"); using (NestedDiagnosticsContext.Push("bar")) { AssertContents(NestedDiagnosticsContext.GetAllMessages(), "bar", "foo"); Assert.AreEqual("bar", NestedDiagnosticsContext.TopMessage); NestedDiagnosticsContext.Push("baz"); AssertContents(NestedDiagnosticsContext.GetAllMessages(), "baz", "bar", "foo"); Assert.AreEqual("baz", NestedDiagnosticsContext.TopMessage); Assert.AreEqual("baz", NestedDiagnosticsContext.Pop()); AssertContents(NestedDiagnosticsContext.GetAllMessages(), "bar", "foo"); Assert.AreEqual("bar", NestedDiagnosticsContext.TopMessage); } AssertContents(NestedDiagnosticsContext.GetAllMessages(), "foo"); Assert.AreEqual("foo", NestedDiagnosticsContext.TopMessage); } AssertContents(NestedDiagnosticsContext.GetAllMessages()); Assert.AreEqual(string.Empty, NestedDiagnosticsContext.Pop()); } catch (Exception ex) { lock (exceptions) { exceptions.Add(ex); } } finally { if (Interlocked.Decrement(ref remaining) == 0) { mre.Set(); } } }); } mre.WaitOne(); Assert.AreEqual(0, exceptions.Count); }
public void NDCTest2_object() { List <Exception> exceptions = new List <Exception>(); ManualResetEvent mre = new ManualResetEvent(false); int counter = 100; int remaining = counter; for (int i = 0; i < counter; ++i) { ThreadPool.QueueUserWorkItem( s => { try { NestedDiagnosticsContext.Clear(); Assert.Null(NestedDiagnosticsContext.TopObject); Assert.Null(NestedDiagnosticsContext.PopObject()); AssertContents(NestedDiagnosticsContext.GetAllMessages()); using (NestedDiagnosticsContext.Push("foo")) { Assert.Equal("foo", NestedDiagnosticsContext.TopObject); AssertContents(NestedDiagnosticsContext.GetAllObjects(), "foo"); using (NestedDiagnosticsContext.Push("bar")) { AssertContents(NestedDiagnosticsContext.GetAllObjects(), "bar", "foo"); Assert.Equal("bar", NestedDiagnosticsContext.TopObject); NestedDiagnosticsContext.Push("baz"); AssertContents(NestedDiagnosticsContext.GetAllObjects(), "baz", "bar", "foo"); Assert.Equal("baz", NestedDiagnosticsContext.TopObject); Assert.Equal("baz", NestedDiagnosticsContext.PopObject()); AssertContents(NestedDiagnosticsContext.GetAllObjects(), "bar", "foo"); Assert.Equal("bar", NestedDiagnosticsContext.TopObject); } AssertContents(NestedDiagnosticsContext.GetAllObjects(), "foo"); Assert.Equal("foo", NestedDiagnosticsContext.TopObject); } AssertContents(NestedDiagnosticsContext.GetAllMessages()); Assert.Null(NestedDiagnosticsContext.PopObject()); } catch (Exception ex) { lock (exceptions) { exceptions.Add(ex); } } finally { if (Interlocked.Decrement(ref remaining) == 0) { mre.Set(); } } }); } mre.WaitOne(); StringBuilder exceptionsMessage = new StringBuilder(); foreach (var ex in exceptions) { if (exceptionsMessage.Length > 0) { exceptionsMessage.Append("\r\n"); } exceptionsMessage.Append(ex.ToString()); } Assert.True(exceptions.Count == 0, exceptionsMessage.ToString()); }