C# 自定义TraceListener Windows应用程序
到目前为止,在我的应用程序中,我正在将所有跟踪事件记录到硬盘上的一个文件中 现在,我想以一个单独的windows跟踪应用程序的形式对其进行增强,该应用程序将侦听 从主应用程序(在生成时)获取跟踪,并在 类似gridview的界面。现在的问题是: 我必须使用哪种TraceListener才能在读取日志信息的速度方面获得最大的好处? 限制 由于某些限制,我不能使用数据库日志记录和读取方法 收听应用程序事件日志会有任何帮助吗C# 自定义TraceListener Windows应用程序,c#,logging,trace,custom-eventlog,C#,Logging,Trace,Custom Eventlog,到目前为止,在我的应用程序中,我正在将所有跟踪事件记录到硬盘上的一个文件中 现在,我想以一个单独的windows跟踪应用程序的形式对其进行增强,该应用程序将侦听 从主应用程序(在生成时)获取跟踪,并在 类似gridview的界面。现在的问题是: 我必须使用哪种TraceListener才能在读取日志信息的速度方面获得最大的好处? 限制 由于某些限制,我不能使用数据库日志记录和读取方法 收听应用程序事件日志会有任何帮助吗 感谢您的建议和时间。默认跟踪侦听器将使用win32 api OutputDe
感谢您的建议和时间。默认跟踪侦听器将使用win32 api OutputDebugString。您可以使用现有工具侦听传递到此方法的消息。看看这个,例如: 也许这会节省你自己写的时间 如果您确实希望编写自己的,并且您主要关心的是尽快将跟踪消息获取到跟踪查看器应用程序,那么您可以让您的TraceListener接受来自查看器的网络连接。每当跟踪侦听器处理跟踪消息时,您都会向网络写入数据。如果您不关心是否能够在远程计算机上查看跟踪消息,那么当然也可以选择监听OutputDebugString的内容 当然,这会影响执行跟踪的应用程序的性能,因此最好异步写入网络,而不阻塞跟踪写入调用。在向网络写入时,您必须将跟踪消息添加到队列以进行处理 下面是一个可能有效的简单示例:
public class NetworkPublishingTraceListener : TraceListener {
private List<string> messages = new List<string>();
private AutoResetEvent messagesAvailable = new AutoResetEvent(false);
private List<TcpClient> traceViewerApps;
private object messageQueueLock = new object();
public NetworkPublishingTraceListener(int port) {
// Setup code for accepting and dealing with network connections.
(new Thread(BackgroundThread) { IsBackground = true }).Start();
}
public override void Write(string message) {
if (traceViewerApps.Count == 0) {
return;
}
lock (messageQueueLock) {
messages.Add(message);
}
messagesAvailable.Set();
}
public override void WriteLine(string message) {
Write(message + Environment.NewLine);
}
private void BackgroundThread() {
while (true) {
messagesAvailable.WaitOne();
List<string> messagesToWrite;
lock (messageQueueLock) {
messagesToWrite = messages;
messages = new List<string>();
}
traceViewerApps.ForEach(viewerApp => {
StreamWriter writer = new StreamWriter(viewerApp.GetStream());
messagesToWrite.ForEach(message => writer.Write(message));
});
}
}
}
公共类NetworkPublishingTraceListener:TraceListener{
私有列表消息=新列表();
private AutoResetEvent messagesAvailable=新的AutoResetEvent(假);
私有列表跟踪窗口;
私有对象messageQueueLock=新对象();
公用网络PublishingTraceListener(int端口){
//用于接受和处理网络连接的设置代码。
(新线程(BackgroundThread){IsBackground=true}).Start();
}
公共重写无效写入(字符串消息){
如果(traceviewrapps.Count==0){
返回;
}
锁(messageQueueLock){
消息。添加(消息);
}
messagesavaailable.Set();
}
公共覆盖无效写线(字符串消息){
编写(message+Environment.NewLine);
}
私有void BackgroundThread(){
while(true){
messagesavaailable.WaitOne();
列表信息;
锁(messageQueueLock){
messagesToWrite=消息;
消息=新列表();
}
traceviewrapps.ForEach(viewerApp=>{
StreamWriter writer=newstreamwriter(viewerApp.GetStream());
messagesToWrite.ForEach(message=>writer.Write(message));
});
}
}
}
你为什么不使用log4net或nlog?你需要自己开发,还是可以使用现有的工具进行开发?我需要独立开发,以供自己理解。谢谢……我知道Mark Russinovichs非常有用的工具。但我需要为自己的利益开发一个。@这给我添加了一个简单的代码示例,说明如何开始实现TraceListener,将跟踪消息发布到外部应用程序。嗨,Gor……原因是我想通过实现它来学习。谢谢:D