TraceLevelHelper.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //----------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //----------------------------------------------------------------
  4. namespace System.Runtime
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Text;
  9. using System.Diagnostics;
  10. /// <remarks>
  11. /// [....] (11/15/10, CSDMain 194940) - Previously, this code first checked that the opcode was set to informational. If not, it would check
  12. /// the opcode name for start, stop, suspend, or resume and use that or return Information otherwise. This does not work well with the latest
  13. /// ETW changes where almost every event has a task and opcode. With the old logic, if an opcode is set on the event with a level such as
  14. /// warning or error, the level would be incorrectly reported in diagnostic tracing as informational. Also, start/stop/suspend/resume events
  15. /// have an overloaded meaning in diagnostic tracing that the svctraceviewer would misinterpret. To keep diagnostic tracing from breaking, this
  16. /// class now checks for start/stop/suspend/resume opcodes and returns the level if any of those do not match. Furthermore, any events defined
  17. /// that are shared between diagnostics and ETW should not use start/stop/suspend/resume opcodes unless explicitly intended for use in
  18. /// diagnostics tracing.
  19. /// </remarks>
  20. class TraceLevelHelper
  21. {
  22. static TraceEventType[] EtwLevelToTraceEventType = { TraceEventType.Critical, TraceEventType.Critical, TraceEventType.Error,
  23. TraceEventType.Warning, TraceEventType.Information, TraceEventType.Verbose
  24. };
  25. internal static TraceEventType GetTraceEventType(byte level, byte opcode)
  26. {
  27. switch (opcode)
  28. {
  29. case (byte)TraceEventOpcode.Start:
  30. return TraceEventType.Start;
  31. case (byte)TraceEventOpcode.Stop:
  32. return TraceEventType.Stop;
  33. case (byte)TraceEventOpcode.Suspend:
  34. return TraceEventType.Suspend;
  35. case (byte)TraceEventOpcode.Resume:
  36. return TraceEventType.Resume;
  37. default:
  38. return EtwLevelToTraceEventType[(int)level];
  39. }
  40. }
  41. internal static TraceEventType GetTraceEventType(TraceEventLevel level)
  42. {
  43. return EtwLevelToTraceEventType[(int)level];
  44. }
  45. internal static TraceEventType GetTraceEventType(byte level)
  46. {
  47. return EtwLevelToTraceEventType[(int)level];
  48. }
  49. internal static string LookupSeverity(TraceEventLevel level, TraceEventOpcode opcode)
  50. {
  51. string severity;
  52. switch (opcode)
  53. {
  54. case TraceEventOpcode.Start:
  55. severity = "Start";
  56. break;
  57. case TraceEventOpcode.Stop:
  58. severity = "Stop";
  59. break;
  60. case TraceEventOpcode.Suspend:
  61. severity = "Suspend";
  62. break;
  63. case TraceEventOpcode.Resume:
  64. severity = "Resume";
  65. break;
  66. default:
  67. switch (level)
  68. {
  69. case TraceEventLevel.Critical:
  70. severity = "Critical";
  71. break;
  72. case TraceEventLevel.Error:
  73. severity = "Error";
  74. break;
  75. case TraceEventLevel.Warning:
  76. severity = "Warning";
  77. break;
  78. case TraceEventLevel.Informational:
  79. severity = "Information";
  80. break;
  81. case TraceEventLevel.Verbose:
  82. severity = "Verbose";
  83. break;
  84. default:
  85. severity = level.ToString();
  86. break;
  87. }
  88. break;
  89. }
  90. return severity;
  91. }
  92. }
  93. }