C# 自定义TraceListener Windows应用程序

C# 自定义TraceListener Windows应用程序,c#,logging,trace,custom-eventlog,C#,Logging,Trace,Custom Eventlog,到目前为止,在我的应用程序中,我正在将所有跟踪事件记录到硬盘上的一个文件中 现在,我想以一个单独的windows跟踪应用程序的形式对其进行增强,该应用程序将侦听 从主应用程序(在生成时)获取跟踪,并在 类似gridview的界面。现在的问题是: 我必须使用哪种TraceListener才能在读取日志信息的速度方面获得最大的好处? 限制 由于某些限制,我不能使用数据库日志记录和读取方法 收听应用程序事件日志会有任何帮助吗 感谢您的建议和时间。默认跟踪侦听器将使用win32 api OutputDe

到目前为止,在我的应用程序中,我正在将所有跟踪事件记录到硬盘上的一个文件中

现在,我想以一个单独的windows跟踪应用程序的形式对其进行增强,该应用程序将侦听

从主应用程序(在生成时)获取跟踪,并在

类似gridview的界面。现在的问题是:

我必须使用哪种TraceListener才能在读取日志信息的速度方面获得最大的好处?

限制 由于某些限制,我不能使用数据库日志记录和读取方法

收听应用程序事件日志会有任何帮助吗


感谢您的建议和时间。

默认跟踪侦听器将使用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));
});
}
}
}

你为什么不使用log4netnlog

你需要自己开发,还是可以使用现有的工具进行开发?我需要独立开发,以供自己理解。谢谢……我知道Mark Russinovichs非常有用的工具。但我需要为自己的利益开发一个。@这给我添加了一个简单的代码示例,说明如何开始实现TraceListener,将跟踪消息发布到外部应用程序。嗨,Gor……原因是我想通过实现它来学习。谢谢:D