2014-01-25 2 views
2

다음 코드를 사용하여 예외를 로그하지만 "mylistener.log"파일에 로그를 쓰지 않습니다. 내가 여기서 무엇을 놓치고 있니? 파일에 데이터를 기록 할 수있는 TraceSource 위해서는은 C#의 TraceSource 메서드를 사용하여 로그 파일에 쓸 수 없습니다.

using System; 
using System.Diagnostics; 

namespace TraceSourceApp 
{ 
    class Program 
    { 
     private static TraceSource mySource = new TraceSource("TraceSourceApp"); 
     static void Main(string[] args) 
     {   
      TextWriterTraceListener textListener = 
       new TextWriterTraceListener("myListener.log"); 

      mySource.Listeners.Add(textListener); 
      int i = 10, j = 0, k; 
      try 
      { 
       k = i/j; 
      } 
      catch 
      { 
       mySource.TraceEvent(TraceEventType.Error, 12, 
        "Division by Zero"); 
      }  
      mySource.Close();    
     }   
    } 
} 
+0

컴파일 타임 상수 TRACE가 정의되어 있습니까? –

답변

2

, 당신은 SourceSwitch 인스턴스에 TraceSource의 Switch -property를 설정해야합니다. 다음과 같이 코드를 변경합니다

static void Main(string[] args) 
{ 
    TextWriterTraceListener textListener = new TextWriterTraceListener("myListener.log"); 
    // New code starts here 
    var sourceSwitch = new SourceSwitch("SourceSwitch", "Verbose"); 
    mySource.Switch = sourceSwitch; 
    // New code ends here 
    mySource.Listeners.Add(textListener); 
    // ... 

을 또한 콘텐츠를 자동으로 플러시 TraceWriter을 가지고, 당신의 주요 방법의 시작 부분에 Trace.AutoFlush을 설정 (샘플없이 작동하지만, 항상 확인하는 것이 좋습니다 청취자를 위해 플러시됩니다) 로그 항목을 느슨하게하지 :

textListener.Flush(); 
mySource.Close(); 
:

대안으로
static void Main(string[] args) 
{ 
    Trace.AutoFlush = true; 
    // ... 

, 당신은 또한 말에 Flush -method를 호출하여 리스너를 명시 적으로 세척 할 수 있습니다

실제 코드에서 try-finally 또는 using 블록을 추가하여 Flush가 호출되고 소스가 닫혔다는 것을 주장하는 것이 좋습니다.

+0

내가 Trace.AutoFlush = true를 쓰면; 라인, 그것은 traevent 출력을 저장하지 않습니다. 동일한 결과가 textListener.Flush()에 대해 얻습니다. – Gomathipriya

+0

@Gomathipriya : 맞습니다. 그 이유는 누락 된 스위치 때문입니다. 샘플을 업데이트했습니다. – Markus

+0

이제 작동 중입니다. 왜 그 스위치가 필요한가요? – Gomathipriya