到目前为止,在我的应用程序中,我将所有跟踪事件记录到硬盘驱动器上的文件中。
我现在想以一个单独的 Windows 跟踪应用程序的形式来增强它,它监听
到主应用程序的跟踪(因为它们是生成的)并在
类似gridview的界面。现在的问题是:
我必须使用哪种 TraceListener 才能在读取日志信息的速度方面获得最大收益?
限制 由于某些限制,我不能使用数据库记录和读取方法
监听应用程序事件日志是否有帮助?
感谢您的建议和时间。
到目前为止,在我的应用程序中,我将所有跟踪事件记录到硬盘驱动器上的文件中。
我现在想以一个单独的 Windows 跟踪应用程序的形式来增强它,它监听
到主应用程序的跟踪(因为它们是生成的)并在
类似gridview的界面。现在的问题是:
我必须使用哪种 TraceListener 才能在读取日志信息的速度方面获得最大收益?
限制 由于某些限制,我不能使用数据库记录和读取方法
监听应用程序事件日志是否有帮助?
感谢您的建议和时间。
默认跟踪侦听器将使用 win32 api OutputDebugString。您可以使用现有工具收听传递给此方法的消息。看看这个,例如:
http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
也许这会节省您编写自己的时间。
如果您确实想编写自己的代码并且您主要关心的是尽快将跟踪消息发送到跟踪查看器应用程序,那么您可以让 TraceListener 接受来自查看器的网络连接。每当跟踪侦听器处理跟踪消息时,您都会写入网络。如果您不担心能否在远程机器上查看跟踪消息,那么当然也可以选择收听输出调试字符串的内容。
这当然会影响执行跟踪的应用程序的性能,因此最好在不阻塞跟踪写入调用的情况下异步完成写入网络。在写入网络时,您必须将跟踪消息添加到要处理的队列中。
这是一个可能有效的简单示例:
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));
});
}
}
}
你为什么不使用log4net或nlog?