private static void WriteInfoIndents( TextWriter writer, Stack <string> indentStack, AsciiTreeIndents asciiTreeIndents, bool isLastChild, bool isLeaf) { foreach (string indent in indentStack) { writer.Write(indent); } if (isLastChild) { writer.Write(asciiTreeIndents.Blank); } else { writer.Write(asciiTreeIndents.Parent); } if (isLeaf) { writer.Write(asciiTreeIndents.Blank); } else { writer.Write(asciiTreeIndents.Parent); } }
public static void WriteTrace( TextWriter writer, ITrace trace, TraceLevel level = TraceLevel.Verbose, AsciiType asciiType = AsciiType.Default) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } if (trace == null) { throw new ArgumentNullException(nameof(trace)); } if ((int)trace.Level > (int)level) { return; } AsciiTreeCharacters asciiTreeCharacter = asciiTreeCharactersMap[asciiType]; AsciiTreeIndents asciiTreeIndents = asciiTreeIndentsMap[asciiType]; writer.WriteLine(asciiTreeCharacter.Root); WriteTraceRecursive(writer, trace, level, asciiTreeIndents, isLastChild: true); }
private static void WriteTraceRecursive( TextWriter writer, ITrace trace, TraceLevel level, AsciiTreeIndents asciiTreeIndents, bool isLastChild) { ITrace parent = trace.Parent; Stack <string> indentStack = new Stack <string>(); while (parent != null) { bool parentIsLastChild = (parent.Parent == null) || parent.Equals(parent.Parent.Children.Last()); if (parentIsLastChild) { indentStack.Push(asciiTreeIndents.Blank); } else { indentStack.Push(asciiTreeIndents.Parent); } parent = parent.Parent; } WriteIndents(writer, indentStack, asciiTreeIndents, isLastChild); writer.Write(trace.Name); writer.Write('('); writer.Write(trace.Id); writer.Write(')'); writer.Write(space); writer.Write(trace.Component); writer.Write('-'); writer.Write("Component"); writer.Write(space); writer.Write(trace.CallerInfo.MemberName); writer.Write('@'); writer.Write(trace.CallerInfo.FilePath.Split('\\').Last()); writer.Write(':'); writer.Write(trace.CallerInfo.LineNumber); writer.Write(space); writer.Write(trace.StartTime.ToString("hh:mm:ss:fff")); writer.Write(space); writer.Write(trace.Duration.TotalMilliseconds.ToString("0.00")); writer.Write(" milliseconds"); writer.Write(space); writer.WriteLine(); if (trace.Data.Count > 0) { bool isLeaf = trace.Children.Count == 0; WriteInfoIndents(writer, indentStack, asciiTreeIndents, isLastChild: isLastChild, isLeaf: isLeaf); writer.WriteLine('('); foreach (KeyValuePair <string, object> kvp in trace.Data) { string key = kvp.Key; object value = kvp.Value; WriteInfoIndents(writer, indentStack, asciiTreeIndents, isLastChild: isLastChild, isLeaf: isLeaf); writer.Write(asciiTreeIndents.Blank); writer.Write('['); writer.Write(key); writer.Write(']'); writer.WriteLine(); if (value is TraceDatum traceDatum) { TraceDatumTextWriter traceDatumTextWriter = new TraceDatumTextWriter(); traceDatum.Accept(traceDatumTextWriter); string[] infoLines = traceDatumTextWriter .ToString() .TrimEnd(newLineCharacters) .Split(newLines, StringSplitOptions.None); foreach (string infoLine in infoLines) { WriteInfoIndents(writer, indentStack, asciiTreeIndents, isLastChild: isLastChild, isLeaf: isLeaf); writer.Write(asciiTreeIndents.Blank); writer.WriteLine(infoLine); } } else { WriteInfoIndents(writer, indentStack, asciiTreeIndents, isLastChild: isLastChild, isLeaf: isLeaf); writer.Write(asciiTreeIndents.Blank); writer.WriteLine(value.ToString()); } } WriteInfoIndents(writer, indentStack, asciiTreeIndents, isLastChild: isLastChild, isLeaf: isLeaf); writer.WriteLine(')'); } for (int i = 0; i < trace.Children.Count - 1; i++) { ITrace child = trace.Children[i]; WriteTraceRecursive(writer, child, level, asciiTreeIndents, isLastChild: false); } if (trace.Children.Count != 0) { ITrace child = trace.Children[trace.Children.Count - 1]; WriteTraceRecursive(writer, child, level, asciiTreeIndents, isLastChild: true); } }