annotate Implab/Diagnostics/Trace.cs @ 281:e0916ddc9950 v3 tip

code cleanup and refactoring
author cin
date Fri, 01 Jun 2018 21:35:24 +0300
parents f07be402ab02
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
1 // enable System.Diagnostics trace methods
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
2 #define TRACE
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
3
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
4 using System;
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
5 using System.Collections.Generic;
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
6 using System.Diagnostics;
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
7 using System.Linq;
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
8 using System.Text;
255
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
9 using System.Threading;
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
10 using System.Threading.Tasks;
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
11
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
12 namespace Implab.Diagnostics {
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
13 public static class Trace<T> {
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
14
281
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
15 static Lazy<TraceSource> _traceSource = new Lazy<TraceSource>(CreateChannel, LazyThreadSafetyMode.ExecutionAndPublication);
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
16
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
17 static int _nextId;
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
18
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
19 static TraceSource CreateChannel() {
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
20 var id = Interlocked.Increment(ref _nextId);
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
21 return new TraceSource(typeof(T).Name);
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
22 }
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
23
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
24 public static TraceSource TraceSource { get { return _traceSource.Value; } }
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
25
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
26 public static IDisposable Subscribe() {
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
27
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
28 throw new NotImplementedException();
e0916ddc9950 code cleanup and refactoring
cin
parents: 280
diff changeset
29 }
255
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
30
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
31 #if NETFX_TRACE_BUG
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
32 readonly static AsyncLocal<object> m_currentOperation = new AsyncLocal<object>();
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
33 #endif
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
34
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
35 /// <summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
36 /// Starts the logical operation nested to the current operation nested to the current one.
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
37 /// </summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
38 public static void StartLogicalOperation() {
252
6f4630d0bcd9 removed absolete Diagnostics classes
cin
parents: 218
diff changeset
39 Trace.CorrelationManager.StartLogicalOperation();
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
40
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
41 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
42
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
43 /// <summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
44 /// Starts the logical operation with the specified name, this name is usefull in logs.
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
45 /// </summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
46 /// <param name="name">Name.</param>
255
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
47 #if NETFX_TRACE_BUG
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
48 public static void StartLogicalOperation(object name) {
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
49 m_currentOperation.Value = name;
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
50 Trace.CorrelationManager.StartLogicalOperation(name);
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
51 }
255
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
52 #else
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
53 public static void StartLogicalOperation(object name) {
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
54 Trace.CorrelationManager.StartLogicalOperation(name);
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
55 }
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
56 #endif
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
57
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
58 /// <summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
59 /// Ends the logical operation and restores the previous one.
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
60 /// </summary>
252
6f4630d0bcd9 removed absolete Diagnostics classes
cin
parents: 218
diff changeset
61 public static void StopLogicalOperation() {
6f4630d0bcd9 removed absolete Diagnostics classes
cin
parents: 218
diff changeset
62 Trace.CorrelationManager.StopLogicalOperation();
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
63 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
64
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
65 /// <summary>
280
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
66 /// Writes a debug message.
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
67 /// </summary>
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
68 /// <param name="format">Format.</param>
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
69 /// <param name="arguments">Arguments.</param>
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
70 [Conditional("DEBUG")]
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
71 public static void Debug(string format, params object[] arguments) {
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
72
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
73 }
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
74
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
75 /// <summary>
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
76 /// Writes an informational message.
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
77 /// </summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
78 /// <param name="format">Format.</param>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
79 /// <param name="arguments">Arguments.</param>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
80 [Conditional("TRACE")]
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
81 public static void Log(string format, params object[] arguments) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
82 TraceSource.TraceEvent(TraceEventType.Information, 0, format, arguments);
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
83 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
84
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
85 /// <summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
86 /// Writes a warning message.
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
87 /// </summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
88 /// <param name="format">Format.</param>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
89 /// <param name="arguments">Arguments.</param>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
90 public static void Warn(string format, params object[] arguments) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
91 TraceSource.TraceEvent(TraceEventType.Warning, 0, format, arguments);
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
92 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
93
280
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
94 /// <summary>
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
95 /// Writes a error message.
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
96 /// </summary>
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
97 /// <param name="format">Format.</param>
f07be402ab02 Added Trace<T>.Debug(...) method for debug messages
cin
parents: 255
diff changeset
98 /// <param name="arguments">Arguments.</param>
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
99 public static void Error(string format, params object[] arguments) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
100 TraceSource.TraceEvent(TraceEventType.Error, 0, format, arguments);
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
101 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
102
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
103 public static void Error(Exception err) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
104 TraceSource.TraceData(TraceEventType.Error, 0, err);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
105 }
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
106
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
107 /// <summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
108 /// This method save the current activity, and transfers to the specified activity,
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
109 /// emits <see cref="TraceEventType.Start"/> and returns a scope of the new
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
110 /// activity.
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
111 /// </summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
112 /// <param name="activityName">The name of the new activity/</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
113 /// <param name="activityId">The identifier of the activity to which
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
114 /// the control will be transferred</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
115 /// <returns>A scope of the new activity, dispose it to transfer
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
116 /// the control back to the original activity.</returns>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
117 public static ActivityScope TransferActivity(string activityName, Guid activityId) {
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
118 var prev = Trace.CorrelationManager.ActivityId;
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
119
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
120 TraceSource.TraceTransfer(0, "Transfer", activityId);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
121 Trace.CorrelationManager.ActivityId = activityId;
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
122 TraceSource.TraceEvent(TraceEventType.Start, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
123
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
124 return new ActivityScope(TraceSource, prev, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
125 }
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
126
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
127 /// <summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
128 /// Emits <see cref="TraceEventType.Start"/> and returns a scope of the
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
129 /// activity.
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
130 /// </summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
131 /// <param name="activityName">The name of the activity to start</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
132 /// <returns>A scope of the new activity, dispose it to emit
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
133 /// <see cref="TraceEventType.Stop"/> for the current activity.</returns>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
134 public static ActivityScope StartActivity(string activityName) {
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
135 if (Trace.CorrelationManager.ActivityId == Guid.Empty)
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
136 Trace.CorrelationManager.ActivityId = Guid.NewGuid();
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
137
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
138 var prev = Trace.CorrelationManager.ActivityId;
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
139
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
140 TraceSource.TraceEvent(TraceEventType.Start, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
141 return new ActivityScope(TraceSource, prev, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
142 }
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
143
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
144 /// <summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
145 /// Creates new <see cref="LogicalOperation(string)"/> and calls
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
146 /// to <see cref="CorrelationManager.StartLogicalOperation(object)"/>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
147 /// passing the created operation as identity. Calls
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
148 /// <see cref="TraceSource.TraceData(TraceEventType, int, object)"/>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
149 /// to notify listeners on operation start.
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
150 /// </summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
151 /// <param name="name">The name of the logical operation.</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
152 /// <returns>Logical operation scope, disposing it will stop
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
153 /// logical operation and notify trace listeners.</returns>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
154 public static LogicalOperationScope LogicalOperation(string name) {
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
155 var operation = new LogicalOperation(name);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
156 TraceSource.TraceData(TraceEventType.Information, TraceEventCodes.StartLogicalOperation, operation);
255
b00441e04738 Adde workaround to the behaviour of the logical operations stack in conjuction
cin
parents: 253
diff changeset
157 StartLogicalOperation(operation);
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
158 return new LogicalOperationScope(TraceSource, operation);
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
159 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
160 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
161 }