LocalTraceListener.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using LJLib.Tools.File;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. namespace LJLib.LocalLog
  6. {
  7. internal class LocalTraceListener : TraceListener
  8. {
  9. #if !(WindowsCE || PocketPC)
  10. private Dictionary<string, byte> oldStack = new Dictionary<string, byte>();
  11. #endif
  12. private object _syncRoot = new object();
  13. private ILogger _logger = null;
  14. private ILogger _requestLogger = null;
  15. public bool HasStack { get; set; }
  16. public LocalTraceListener(ILogger logger) { _logger = logger; }
  17. public LocalTraceListener(ILogger logger, ILogger requestLogger) { _logger = logger; _requestLogger = requestLogger; }
  18. public override void Write(string message)
  19. {
  20. lock (_syncRoot)
  21. {
  22. if (_logger != null)
  23. {
  24. try
  25. {
  26. if (HasStack) // 包含堆栈信息
  27. {
  28. #if !(WindowsCE || PocketPC)
  29. var stack = (new StackTrace()).ToString();
  30. var key = stack;
  31. var index = message.IndexOf(": ");
  32. if (index >= 0)
  33. {
  34. key += message.Substring(0, index);
  35. }
  36. if (!oldStack.ContainsKey(key)) // 重复的堆栈信息不输出
  37. {
  38. oldStack.Add(key, 1);
  39. message += "\r\n" + stack;
  40. _logger.WriteLog(message);
  41. }
  42. #endif
  43. }
  44. else // 不包含堆栈信息
  45. {
  46. _logger.WriteLog(message);
  47. }
  48. }
  49. catch (Exception ex) { }
  50. }
  51. }
  52. }
  53. public override void WriteLine(string message)
  54. {
  55. Write(message);
  56. }
  57. public override void Write(string message, string category)
  58. {
  59. try
  60. {
  61. if (HasStack)
  62. {
  63. var stack = new StackTrace().ToString();
  64. var key = stack;
  65. var index = message.IndexOf(": ");
  66. if (index >= 0)
  67. {
  68. key += message.Substring(0, index);
  69. }
  70. bool shouldWrite = false;
  71. lock (_syncRoot)
  72. {
  73. if (!oldStack.ContainsKey(key)) // 避免重复堆栈
  74. {
  75. oldStack.Add(key, 1);
  76. shouldWrite = true;
  77. }
  78. }
  79. if (shouldWrite)
  80. {
  81. GetLogger(category).WriteLog(message + "\r\n" + stack);
  82. }
  83. }
  84. else
  85. {
  86. GetLogger(category).WriteLog(message);
  87. }
  88. }
  89. catch (Exception ex)
  90. {
  91. System.Diagnostics.Trace.WriteLine(ex.ToString(), "LoggerError");
  92. }
  93. }
  94. private ILogger GetLogger(string category)
  95. {
  96. if (string.Equals(category, "Request", StringComparison.OrdinalIgnoreCase))
  97. {
  98. return _requestLogger ?? _logger;
  99. }
  100. return _logger;
  101. }
  102. }
  103. }