annotate Implab/Diagnostics/Trace.cs @ 255:b00441e04738 v3

Adde workaround to the behaviour of the logical operations stack in conjuction with async/await methods
author cin
date Wed, 04 Apr 2018 15:38:48 +0300
parents 34df34841225
children f07be402ab02
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>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
49 /// Writes an informational message.
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
50 /// </summary>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
51 /// <param name="format">Format.</param>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
52 /// <param name="arguments">Arguments.</param>
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
53 [Conditional("TRACE")]
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
54 public static void Log(string format, params object[] arguments) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
55 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
56 }
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 /// Writes a warning 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 Warn(string format, params object[] arguments) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
65 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
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 [Conditional("TRACE")]
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
69 public static void Error(string format, params object[] arguments) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
70 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
71 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
72
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
73 [Conditional("TRACE")]
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
74 public static void Error(Exception err) {
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
75 TraceSource.TraceData(TraceEventType.Error, 0, err);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
76 }
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
77
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
78 /// <summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
79 /// This method save the current activity, and transfers to the specified activity,
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
80 /// emits <see cref="TraceEventType.Start"/> and returns a scope of the new
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
81 /// activity.
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
82 /// </summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
83 /// <param name="activityName">The name of the new activity/</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
84 /// <param name="activityId">The identifier of the activity to which
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
85 /// the control will be transferred</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
86 /// <returns>A scope of the new activity, dispose it to transfer
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
87 /// the control back to the original activity.</returns>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
88 public static ActivityScope TransferActivity(string activityName, Guid activityId) {
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
89 var prev = Trace.CorrelationManager.ActivityId;
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
90
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
91 TraceSource.TraceTransfer(0, "Transfer", activityId);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
92 Trace.CorrelationManager.ActivityId = activityId;
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
93 TraceSource.TraceEvent(TraceEventType.Start, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
94
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
95 return new ActivityScope(TraceSource, prev, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
96 }
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
97
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
98 /// <summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
99 /// Emits <see cref="TraceEventType.Start"/> and returns a scope of the
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
100 /// activity.
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
101 /// </summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
102 /// <param name="activityName">The name of the activity to start</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
103 /// <returns>A scope of the new activity, dispose it to emit
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
104 /// <see cref="TraceEventType.Stop"/> for the current activity.</returns>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
105 public static ActivityScope StartActivity(string activityName) {
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
106 if (Trace.CorrelationManager.ActivityId == Guid.Empty)
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
107 Trace.CorrelationManager.ActivityId = Guid.NewGuid();
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
108
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
109 var prev = Trace.CorrelationManager.ActivityId;
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
110
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
111 TraceSource.TraceEvent(TraceEventType.Start, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
112 return new ActivityScope(TraceSource, prev, 0, activityName);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
113 }
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
114
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
115 /// <summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
116 /// Creates new <see cref="LogicalOperation(string)"/> and calls
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
117 /// to <see cref="CorrelationManager.StartLogicalOperation(object)"/>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
118 /// passing the created operation as identity. Calls
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
119 /// <see cref="TraceSource.TraceData(TraceEventType, int, object)"/>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
120 /// to notify listeners on operation start.
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
121 /// </summary>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
122 /// <param name="name">The name of the logical operation.</param>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
123 /// <returns>Logical operation scope, disposing it will stop
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
124 /// logical operation and notify trace listeners.</returns>
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
125 public static LogicalOperationScope LogicalOperation(string name) {
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
126 var operation = new LogicalOperation(name);
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
127 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
128 StartLogicalOperation(operation);
253
34df34841225 Implab.Diagnostics drafts
cin
parents: 252
diff changeset
129 return new LogicalOperationScope(TraceSource, operation);
212
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
130 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
131 }
a01d9df88d74 Added class Trace<T> to manage channels for individual classes, if SomeClass
cin
parents:
diff changeset
132 }