LocalTraceListener.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. public bool HasStack { get; set; }
  15. public LocalTraceListener(ILogger logger) { _logger = logger; }
  16. public override void Write(string message)
  17. {
  18. lock (_syncRoot)
  19. {
  20. if (_logger != null)
  21. {
  22. try
  23. {
  24. if (HasStack) // 包含堆栈信息
  25. {
  26. #if !(WindowsCE || PocketPC)
  27. var stack = (new StackTrace()).ToString();
  28. var key = stack;
  29. var index = message.IndexOf(": ");
  30. if (index >= 0)
  31. {
  32. key += message.Substring(0, index);
  33. }
  34. if (!oldStack.ContainsKey(key)) // 重复的堆栈信息不输出
  35. {
  36. oldStack.Add(key, 1);
  37. message += "\r\n" + stack;
  38. _logger.WriteLog(message);
  39. }
  40. #endif
  41. }
  42. else // 不包含堆栈信息
  43. {
  44. _logger.WriteLog(message);
  45. }
  46. }
  47. catch (Exception ex) { }
  48. }
  49. }
  50. }
  51. public override void WriteLine(string message)
  52. {
  53. Write(message);
  54. }
  55. }
  56. }