【原创】基于UDP广播的局域网Web Window Service日志跟踪小工具
2013-12-08 13:06
405 查看
一直感觉Web开发或者windows服务的日志跟踪调试不是很方便 特别是在生产环境服务器上面 目前一般的解决方案是通过各种日志工具把错误信息和调试信息写到数据库或者文件里面 想要看到最新日志必须各种不停的打开关闭刷新 特别是日志较多的时候很麻烦 过滤筛选也不方便
调试信息记录过多又有性能开销,记录过少又不方便调试 也比较纠结 sql调试跟踪工具Sql Profile大家都用过,是不是感觉很方便 总结了3个优点 1、方便 可以异地跟踪 强大的筛选功能 2、高效 最少不使用的时候应该不会影响MSQLSERVER的性能 3、可以几个客户端同时跟踪一台服务器
受到启发写了这么一个小工具 主要思路 应用端 继承TraceListener 通过UDP协议广播日志消息 日志查看工具 监听局域网UDP广播日志消息,筛选过滤消息 通过控制台打印出来 用UDP主要是因为效率高 无连接状态 应用端只管发送消息 不用关心有没有收听的 有没有收到
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;
this.Filter = new UdpTraceFilter(this);
ServerPort = serverPort;
}
public override void Write(string message)
{
}
public override void WriteLine(string message)
{
var data = System.Text.Encoding.UTF8.GetBytes(EventType + "|" + message);
Client.Send(data, data.Length, new IPEndPoint(IPAddress.Broadcast, ServerPort));
}
public class UdpTraceFilter : TraceFilter
{
UdpTraceListener Listener;
public UdpTraceFilter(UdpTraceListener listener)
{
Listener = listener;
}
public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data)
{
Listener.EventType = eventType;
return true;
}
}
}
控制台小工具
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;
while (!int.TryParse(portStr, out port))
{
Console.WriteLine("请输入监听端口号:");
portStr = Console.ReadLine();
}
IPAddress ipAddress = IPAddress.Any;
UdpClient udpClient = new UdpClient(port);
udpClient.EnableBroadcast = true;
Console.WriteLine("开始监听...");
while (true)
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
var log = Encoding.UTF8.GetString(receiveBytes);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("{0} {1}", DateTime.Now, RemoteIpEndPoint);
TraceEventType result;
if (log.Contains("|"))
{
var type = log.Split('|')[0];
log = log.Substring(type.Length + 1);
if (System.Enum.TryParse<TraceEventType>(type, out result))
{
if (result == TraceEventType.Error)
Console.ForegroundColor = ConsoleColor.Red;
else if (result == TraceEventType.Warning)
Console.ForegroundColor = ConsoleColor.Yellow;
else if (result == TraceEventType.Information)
Console.ForegroundColor = ConsoleColor.Green;
}
}
Console.WriteLine(log);
Console.WriteLine("");
Console.ForegroundColor = ConsoleColor.White;
}52 }
web.config
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="UdpTraceListener" type="UdpTraceListener" initializeData="8888"></add>
</listeners>
</trace> </system.diagnostics>
如果需要记录全局的错误的话 需要配置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));
// 在出现未处理的错误时运行的代码
} }
在其它任何需要调试的地方调用 以下方法即可
Trace.TraceWarning();Trace.TraceInformation();Trace.TraceError(); Windows Service WCF使用方法基本上差不多 在app.config里面做同样的配置
目前没有实现高级筛选功能
调试信息记录过多又有性能开销,记录过少又不方便调试 也比较纠结 sql调试跟踪工具Sql Profile大家都用过,是不是感觉很方便 总结了3个优点 1、方便 可以异地跟踪 强大的筛选功能 2、高效 最少不使用的时候应该不会影响MSQLSERVER的性能 3、可以几个客户端同时跟踪一台服务器
受到启发写了这么一个小工具 主要思路 应用端 继承TraceListener 通过UDP协议广播日志消息 日志查看工具 监听局域网UDP广播日志消息,筛选过滤消息 通过控制台打印出来 用UDP主要是因为效率高 无连接状态 应用端只管发送消息 不用关心有没有收听的 有没有收到
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;
this.Filter = new UdpTraceFilter(this);
ServerPort = serverPort;
}
public override void Write(string message)
{
}
public override void WriteLine(string message)
{
var data = System.Text.Encoding.UTF8.GetBytes(EventType + "|" + message);
Client.Send(data, data.Length, new IPEndPoint(IPAddress.Broadcast, ServerPort));
}
public class UdpTraceFilter : TraceFilter
{
UdpTraceListener Listener;
public UdpTraceFilter(UdpTraceListener listener)
{
Listener = listener;
}
public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data)
{
Listener.EventType = eventType;
return true;
}
}
}
控制台小工具
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;
while (!int.TryParse(portStr, out port))
{
Console.WriteLine("请输入监听端口号:");
portStr = Console.ReadLine();
}
IPAddress ipAddress = IPAddress.Any;
UdpClient udpClient = new UdpClient(port);
udpClient.EnableBroadcast = true;
Console.WriteLine("开始监听...");
while (true)
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
var log = Encoding.UTF8.GetString(receiveBytes);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("{0} {1}", DateTime.Now, RemoteIpEndPoint);
TraceEventType result;
if (log.Contains("|"))
{
var type = log.Split('|')[0];
log = log.Substring(type.Length + 1);
if (System.Enum.TryParse<TraceEventType>(type, out result))
{
if (result == TraceEventType.Error)
Console.ForegroundColor = ConsoleColor.Red;
else if (result == TraceEventType.Warning)
Console.ForegroundColor = ConsoleColor.Yellow;
else if (result == TraceEventType.Information)
Console.ForegroundColor = ConsoleColor.Green;
}
}
Console.WriteLine(log);
Console.WriteLine("");
Console.ForegroundColor = ConsoleColor.White;
}52 }
web.config
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="UdpTraceListener" type="UdpTraceListener" initializeData="8888"></add>
</listeners>
</trace> </system.diagnostics>
如果需要记录全局的错误的话 需要配置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));
// 在出现未处理的错误时运行的代码
} }
在其它任何需要调试的地方调用 以下方法即可
Trace.TraceWarning();Trace.TraceInformation();Trace.TraceError(); Windows Service WCF使用方法基本上差不多 在app.config里面做同样的配置
目前没有实现高级筛选功能
相关文章推荐
- 蓝桥杯:错误票据
- hdu 1596 find the safest road
- eclipse 中引用其他项目及项目打包
- Google history
- 数据结构c语言实现之顺序线性表
- 全球最好的10的商品搜索引擎
- MSP430 JTAG引脚图
- 平方乘算法实现
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- HAProxy实现网站高并发集群
- 黑马程序员_JAVA中的二分查找(课堂笔记)
- 老鼠走迷官(二)
- 其實yahoo公司也不是想像中那麼末日
- 帮助了解当前线程/进程/系统效能的API
- 拒绝喝酒理由1
- 关于window.opener的一个小记录
- 1570C旅行(关于路径条数问题)
- PHP 【解决】中文乱码问题
- 浅谈接口、抽象类、抽象方法和虚方法的区别
- stm32快速学习4——串口发送字符