annotate Implab/Diagnostics/Trace.cs @ 280:f07be402ab02 v3

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