Пользовательское приложение TraceListener для Windows - PullRequest
1 голос
/ 28 января 2011

Пока в моем приложении я записываю все события трассировки в файл на моем жестком диске.

Теперь я хочу улучшить его в виде отдельного приложения трассировки Windows, которое прослушивает

для трассировки из основного приложения (по мере их генерирования) и передачи отчета по интерфейсу, подобному сетке

.Теперь вопрос:

Какой тип TraceListener мне нужно использовать, чтобы получить максимальные выгоды от скорости, с которой читается информация журнала?

Ограничения Из-за определенных ограничений я не могу использовать метод ведения журнала и чтения базы данных

Поможет ли прослушивание приложения eventLogs каким-либо образом?

Спасибо за предложения и время.

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Приемник трассировки по умолчанию будет использовать win32 api OutputDebugString.Вы можете прослушивать сообщения, передаваемые этому методу, используя существующие инструменты.Посмотрите на это, например:

http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

Возможно, это сэкономит вам время, необходимое для написания вашего собственного.

Если вы действительно хотите написатьВаша и ваша главная задача - как можно быстрее получать сообщения трассировки в приложение просмотра трассировки, тогда вы можете заставить свой 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));
            });
        }
    }
}
0 голосов
/ 28 января 2011

Почему бы вам не использовать log4net или nlog ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...