| 253 | 1 using System; | 
|  | 2 using System.Diagnostics; | 
|  | 3 using System.IO; | 
|  | 4 | 
|  | 5 namespace Implab.Diagnostics { | 
|  | 6     public class SimpleTraceListener : TextWriterTraceListener { | 
|  | 7         public SimpleTraceListener() { | 
|  | 8         } | 
|  | 9 | 
|  | 10         public SimpleTraceListener(Stream stream) : base(stream) { | 
|  | 11         } | 
|  | 12 | 
|  | 13         public SimpleTraceListener(TextWriter writer) : base(writer) { | 
|  | 14         } | 
|  | 15 | 
|  | 16         public SimpleTraceListener(string fileName) : base(fileName) { | 
|  | 17         } | 
|  | 18 | 
|  | 19         public SimpleTraceListener(Stream stream, string name) : base(stream, name) { | 
|  | 20         } | 
|  | 21 | 
|  | 22         public SimpleTraceListener(TextWriter writer, string name) : base(writer, name) { | 
|  | 23         } | 
|  | 24 | 
|  | 25         public SimpleTraceListener(string fileName, string name) : base(fileName, name) { | 
|  | 26         } | 
|  | 27 | 
|  | 28         public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data) { | 
|  | 29             switch (id) { | 
|  | 30                 case TraceEventCodes.StartLogicalOperation: | 
|  | 31                     TraceEvent(eventCache, source, eventType, id, "+{0}", data); | 
|  | 32                     break; | 
|  | 33                 case TraceEventCodes.StopLogicalOperation: | 
|  | 34                     TraceEvent(eventCache, source, eventType, id, FormatStopLogicalOperation(data)); | 
|  | 35                     break; | 
|  | 36                 default: | 
|  | 37                     TraceEvent(eventCache, source, eventType, id, data?.ToString()); | 
|  | 38                     break; | 
|  | 39             } | 
|  | 40         } | 
|  | 41 | 
|  | 42         string FormatStopLogicalOperation(object data) { | 
|  | 43             if (data is LogicalOperation op) { | 
|  | 44                 return string.Format("-{0} ({1})", op, FormatTimespan(op.OperationStopwatch.Elapsed)); | 
|  | 45             } else { | 
|  | 46                 return data?.ToString(); | 
|  | 47             } | 
|  | 48         } | 
|  | 49 | 
|  | 50         string FormatTimespan(TimeSpan value) { | 
|  | 51             if (value.TotalSeconds < 10) { | 
|  | 52                 return value.Milliseconds.ToString() + "ms"; | 
|  | 53             } else if (value.TotalSeconds < 30) { | 
|  | 54                 return string.Format("{0:0.###}s", value.TotalSeconds); | 
|  | 55             } else { | 
|  | 56                 return value.ToString(); | 
|  | 57             } | 
|  | 58         } | 
|  | 59 | 
|  | 60         public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data) { | 
|  | 61             var prev = IndentLevel; | 
|  | 62             IndentLevel += eventCache.LogicalOperationStack.Count; | 
|  | 63             try { | 
|  | 64                 base.TraceData(eventCache, source, eventType, id, data); | 
|  | 65             } finally { | 
|  | 66                 IndentLevel = prev; | 
|  | 67             } | 
|  | 68         } | 
|  | 69 | 
|  | 70         public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id) { | 
|  | 71             var prev = IndentLevel; | 
|  | 72             IndentLevel += eventCache.LogicalOperationStack.Count; | 
|  | 73             try { | 
|  | 74                 base.TraceEvent(eventCache, source, eventType, id); | 
|  | 75             } finally { | 
|  | 76                 IndentLevel = prev; | 
|  | 77             } | 
|  | 78         } | 
|  | 79 | 
|  | 80         public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args) { | 
|  | 81             TraceEvent(eventCache, source, eventType, id, String.Format(format, args)); | 
|  | 82         } | 
|  | 83 | 
|  | 84         public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) { | 
|  | 85             var prev = IndentLevel; | 
|  | 86             IndentLevel += eventCache.LogicalOperationStack.Count; | 
|  | 87             try { | 
|  | 88                 LogicalOperation operation = null; | 
|  | 89                 if (eventCache.LogicalOperationStack.Count > 0) | 
|  | 90                     operation = eventCache.LogicalOperationStack.Peek() as LogicalOperation; | 
|  | 91 | 
|  | 92                 if (operation != null) { | 
|  | 93                     base.TraceData(eventCache, source, eventType, id, FormatTimespan(operation.OperationStopwatch.Elapsed) + ": " + message); | 
|  | 94                 } else { | 
|  | 95                     base.TraceData(eventCache, source, eventType, id, message); | 
|  | 96                 } | 
|  | 97             } finally { | 
|  | 98                 IndentLevel = prev; | 
|  | 99             } | 
|  | 100         } | 
|  | 101 | 
|  | 102         public override void TraceTransfer(TraceEventCache eventCache, string source, int id, string message, Guid relatedActivityId) { | 
|  | 103             var prev = IndentLevel; | 
|  | 104             IndentLevel += eventCache.LogicalOperationStack.Count; | 
|  | 105             try { | 
|  | 106                 base.TraceTransfer(eventCache, source, id, message, relatedActivityId); | 
|  | 107             } finally { | 
|  | 108                 IndentLevel = prev; | 
|  | 109             } | 
|  | 110         } | 
|  | 111 | 
|  | 112 | 
|  | 113     } | 
|  | 114 } |