一直感受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裏面作一樣的配置
目前沒有實現高級篩選功能