You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

LoggerExtension.cs 4.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.ComponentModel;
  3. using System.IO;
  4. using System.Net.Sockets;
  5. using System.Net;
  6. using System.Diagnostics;
  7. using System.Text;
  8. using Shadowsocks.Util.SystemProxy;
  9. namespace NLog
  10. {
  11. public static class LoggerExtension
  12. {
  13. public static void Dump(this Logger logger, string tag, byte[] arr, int length)
  14. {
  15. if (logger.IsTraceEnabled)
  16. {
  17. var sb = new StringBuilder($"{Environment.NewLine}{tag}: ");
  18. for (int i = 0; i < length - 1; i++)
  19. {
  20. sb.Append($"0x{arr[i]:X2}, ");
  21. }
  22. sb.Append($"0x{arr[length - 1]:X2}");
  23. sb.Append(Environment.NewLine);
  24. logger.Trace(sb.ToString());
  25. }
  26. }
  27. public static void Debug(this Logger logger, EndPoint local, EndPoint remote, int len, string header = null, string tailer = null)
  28. {
  29. if (logger.IsDebugEnabled)
  30. {
  31. if (header == null && tailer == null)
  32. logger.Debug($"{local} => {remote} (size={len})");
  33. else if (header == null && tailer != null)
  34. logger.Debug($"{local} => {remote} (size={len}), {tailer}");
  35. else if (header != null && tailer == null)
  36. logger.Debug($"{header}: {local} => {remote} (size={len})");
  37. else
  38. logger.Debug($"{header}: {local} => {remote} (size={len}), {tailer}");
  39. }
  40. }
  41. public static void Debug(this Logger logger, Socket sock, int len, string header = null, string tailer = null)
  42. {
  43. if (logger.IsDebugEnabled)
  44. {
  45. logger.Debug(sock.LocalEndPoint, sock.RemoteEndPoint, len, header, tailer);
  46. }
  47. }
  48. public static void LogUsefulException(this Logger logger, Exception e)
  49. {
  50. // just log useful exceptions, not all of them
  51. if (e is SocketException)
  52. {
  53. SocketException se = (SocketException)e;
  54. if (se.SocketErrorCode == SocketError.ConnectionAborted)
  55. {
  56. // closed by browser when sending
  57. // normally happens when download is canceled or a tab is closed before page is loaded
  58. }
  59. else if (se.SocketErrorCode == SocketError.ConnectionReset)
  60. {
  61. // received rst
  62. }
  63. else if (se.SocketErrorCode == SocketError.NotConnected)
  64. {
  65. // The application tried to send or receive data, and the System.Net.Sockets.Socket is not connected.
  66. }
  67. else if (se.SocketErrorCode == SocketError.HostUnreachable)
  68. {
  69. // There is no network route to the specified host.
  70. }
  71. else if (se.SocketErrorCode == SocketError.TimedOut)
  72. {
  73. // The connection attempt timed out, or the connected host has failed to respond.
  74. }
  75. else
  76. {
  77. logger.Warn(e);
  78. }
  79. }
  80. else if (e is ObjectDisposedException)
  81. {
  82. }
  83. else if (e is Win32Exception)
  84. {
  85. var ex = (Win32Exception)e;
  86. // Win32Exception (0x80004005): A 32 bit processes cannot access modules of a 64 bit process.
  87. if ((uint)ex.ErrorCode != 0x80004005)
  88. {
  89. logger.Warn(e);
  90. }
  91. }
  92. else if (e is ProxyException)
  93. {
  94. var ex = (ProxyException)e;
  95. switch (ex.Type)
  96. {
  97. case ProxyExceptionType.FailToRun:
  98. case ProxyExceptionType.QueryReturnMalformed:
  99. case ProxyExceptionType.SysproxyExitError:
  100. logger.Error($"sysproxy - {ex.Type.ToString()}:{ex.Message}");
  101. break;
  102. case ProxyExceptionType.QueryReturnEmpty:
  103. case ProxyExceptionType.Unspecific:
  104. logger.Error($"sysproxy - {ex.Type.ToString()}");
  105. break;
  106. }
  107. }
  108. else
  109. {
  110. logger.Warn(e);
  111. }
  112. }
  113. }
  114. }