【原創】基於UDP廣播的局域網Web Window Service日誌跟蹤小工具

       一直感受Web開發或者windows服務的日誌跟蹤調試不是很方便
         特別是在生產環境服務器上面
         目前通常的解決方案是經過各類日誌工具把錯誤信息和調試信息寫到數據庫或者文件裏面
          想要看到最新日誌必須各類不停的打開關閉刷新

特別是日誌較多的時候很麻煩 過濾篩選也不方便 web

         調試信息記錄過多又有性能開銷,記錄過少又不方便調試 也比較糾結
         
         sql調試跟蹤工具 Sql Profile你們都用過,是否是感受很方便
         總結了3個優勢
            一、方便 能夠異地跟蹤 強大的篩選功能
            二、高效 最少不使用的時候應該不會影響MSQLSERVER的性能
            三、能夠幾個客戶端同時跟蹤一臺服務器

 

         
         受到啓發寫了這麼一個小工具 主要思路
            應用端 繼承TraceListener 經過UDP協議廣播日誌消息
            日誌查看工具 監聽局域網UDP廣播日誌消息,篩選過濾消息 經過控制檯打印出來 

            用UDP主要是由於效率高 無鏈接狀態  應用端只管發送消息  不用關心有沒有收聽的 有沒有收到sql

 

  1    public class UdpTraceListener : TraceListener數據庫

 2     {
 3          public TraceEventType EventType;
 4         UdpClient Client;
 5          int ServerPort;
 6          public UdpTraceListener( int serverPort)
 7         {
 8             Client =  new UdpClient();
 9             Client.EnableBroadcast =  true;
10              this.Filter =  new UdpTraceFilter( this);
11             ServerPort = serverPort;
12         }
13 
14          public  override  void Write( string message)
15         {
16 
17         }
18 
19          public  override  void WriteLine( string message)
20         {
21              var data = System.Text.Encoding.UTF8.GetBytes(EventType +  " | " + message);
22             Client.Send(data, data.Length,  new IPEndPoint(IPAddress.Broadcast, ServerPort));
23         }
24 
25          public  class UdpTraceFilter : TraceFilter
26         {
27             UdpTraceListener Listener;
28              public UdpTraceFilter(UdpTraceListener listener)
29             {
30                 Listener = listener;
31             }
32 
33              public  override  bool ShouldTrace(TraceEventCache cache,  string source, TraceEventType eventType,  int id,  string formatOrMessage,  object[] args,  object data1,  object[] data)
34             {
35                 Listener.EventType = eventType;
36                  return  true;
37             }
38         }
39 
40     }

 

 控制檯小工具windows

 1   static  void Main( string[] args)
 2         {
 3             Console.WindowWidth =  100;
 4             Console.Title =  " UDP遠程日誌監視器 ";
 5 
 6 
 7 
 8              var portStr =  string.Empty;
 9              int port =  0;
10              while (! int.TryParse(portStr,  out port))
11             {
12                 Console.WriteLine( " 請輸入監聽端口號: ");
13                 portStr = Console.ReadLine();
14             }
15 
16 
17             IPAddress ipAddress = IPAddress.Any;
18             UdpClient udpClient =  new UdpClient(port);
19             udpClient.EnableBroadcast =  true;
20             Console.WriteLine( " 開始監聽... ");
21              while ( true)
22             {
23             
24 
25                 IPEndPoint RemoteIpEndPoint =  new IPEndPoint(IPAddress.Any,  0);
26                 Byte[] receiveBytes = udpClient.Receive( ref RemoteIpEndPoint);
27 
28                  var log = Encoding.UTF8.GetString(receiveBytes);
29                 Console.ForegroundColor = ConsoleColor.White;
30                 Console.WriteLine( " {0} {1} ", DateTime.Now, RemoteIpEndPoint);
31                 TraceEventType result;
32 
33                  if (log.Contains( " | "))
34                 {
35                      var type = log.Split( ' | ')[ 0];
36                     log = log.Substring(type.Length +  1);
37                      if (System.Enum.TryParse<TraceEventType>(type,  out result))
38                     {
39                          if (result == TraceEventType.Error)
40                             Console.ForegroundColor = ConsoleColor.Red;
41                          else  if (result == TraceEventType.Warning)
42                             Console.ForegroundColor = ConsoleColor.Yellow;
43                          else  if (result == TraceEventType.Information)
44                             Console.ForegroundColor = ConsoleColor.Green;
45                     }
46                 }
47 
48                 Console.WriteLine(log);
49                 Console.WriteLine( "");
50                 Console.ForegroundColor = ConsoleColor.White;
51             }

52         }服務器

 

web.configapp

   < system.diagnostics >
     < trace  autoflush ="true" >
       < listeners >
         < add  name ="UdpTraceListener"  type ="UdpTraceListener"  initializeData ="8888" ></ add >
       </ listeners >
     </ trace >

  </system.diagnostics>ide

 

 若是須要記錄全局的錯誤的話 須要配置Global 的Application_Error工具

Global 性能

     public  class Global : HttpApplication
    {
  
         void Application_Start( object sender, EventArgs e)
        {
             //  在應用程序啓動時運行的代碼
            Trace.TraceInformation( " Application_Start ");


        }

         void Application_End( object sender, EventArgs e)
        {
            Trace.TraceInformation( " Application_End ");
             //   在應用程序關閉時運行的代碼

        }

         void Application_Error( object sender, EventArgs e)
        {
            Exception ex = Server.GetLastError().GetBaseException();
            Trace.TraceError( string.Format( " message:{0}\r\ntargetClass:{1}\r\nstackTrace:{2}\r\n ", ex.Message, ex.TargetSite.DeclaringType.FullName,ex.StackTrace));
             //  在出現未處理的錯誤時運行的代碼

        }

    }this

在其它任何須要調試的地方調用 如下方法便可

Trace.TraceWarning();
Trace.TraceInformation();
Trace.TraceError();

 Windows Service WCF使用方法基本上差很少 在app.config裏面作一樣的配置

 目前沒有實現高級篩選功能

相關文章
相關標籤/搜索