2011-01-28 2 views
1

지금까지 내 응용 프로그램에서 모든 추적 이벤트를 내 하드 드라이브의 파일에 기록하고 있습니다.사용자 지정 TraceListener Windows 응용 프로그램

지금 (그들은 발생으로) 메인 응용 프로그램에서 추적에

을 청취 별도의 창 추적 응용 프로그램의 형태를 강화하고 인터페이스와 같은

있는 gridview에보고 할

. 이제 질문은 :

로그 정보를 읽는 속도의 최대 이점을 얻으려면 어떤 종류의 TraceListener를 사용해야합니까?

제한 특정 제한으로 인해 , 나는에서는 Eventlogs 어떤 식 으로든 도움이 응용 프로그램을 듣고 데이터베이스 로깅 및 읽기 방법

윌을 사용할 수 없습니다?

제안과 시간을 보내 주셔서 감사합니다.

+0

직접 개발해야합니까, 아니면 이것을 위해 기존 도구를 사용할 수 있습니까? –

+0

나는 내 자신의 이해를 위해 이것을 독립적으로 개발할 필요가있다. –

답변

3

기본 추적 수신기는 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

감사합니다 ... 마크 Russinovichs의 놀랍도록 도움이되는 도구를 알고 있습니다. 그러나 나는 내 자신을 위해서 하나를 개발해야한다. –

+0

@ this-Me 외부 응용 프로그램에 추적 메시지를 게시하는 TraceListener 구현을 시작하는 방법에 대한 간단한 코드 예제를 추가했습니다. –

+0

감사합니다. Andreas ... 임씨가 작업 중입니다. :) –

0

log4net 또는 nlog를 사용하지 마십시오

여기에 아마 작동하는 간단한 예입니다?

+1

안녕 Gor ... 이유는 그것을 구현하여 배우고 싶습니다. 감사 : D –

관련 문제