LocalTraceListener.cs 3.5 KB

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