2011-08-03 3 views
1

여기 C# 전문가에게 조언을 구합니다. 내 디버그 로그에 문제가 있습니다. 파일을 열어 제공된 문자열을 쓰고 파일을 다시 닫는 간단한 클래스가 있습니다. 그러나 때때로 멀티 스레딩을 사용하는 동안이 디버그 로그를 사용해야합니다. 이로 인해 문제가 발생합니다. 파일을 두 번 이상 열 수 없으므로 잠긴 파일을 다시 열려고 시도하기 때문에 예외가 발생합니다. 이 목적을 위해이 예외를 방지하는 "캐시 된 디버그 로그"와 같은 것을 갖고 싶습니다. 이것을 구현하는 쉬운 방법이 있습니까? 많은 감사드립니다.C# "캐시 된 디버그 로그"

답변

2

C# 4.0은 System.Collections.Concurrent.ConcurrentQueue<T>과 같은 스레드로부터 안전한 컬렉션을 제공합니다. 로깅 클래스가 자체 스레드에서 실행되도록 로깅 클래스를 수정할 수 있으며 로그 메서드 호출은 이러한 큐에 메시지를 추가하기 만하면됩니다. 그렇게하면 로깅 스레드가 항목을 대기열에서 안전하게 읽고 큐를 중단하지 않고 파일에 쓸 수 있습니다. 물론

편집

이 할 수있는 가장 편리한 것은 이미 돌봐이 물건을 가지고 기존의 로깅 프레임 워크를 사용하여 시작하는 것입니다. log4net은 가치있는 경쟁자이기는하지만 NLog를 권하고 싶습니다.

+0

+1 NLog는 log4net보다 좋다고 생각합니다. – kprobst

1

이것은 일반적으로 코드의 모든 부분에서 호출하는 단일 로거를 사용함으로써 수행됩니다. 로거는 파일에 직접 액세스하는 유일한 것입니다. 이 작업을 수행하는 여러 프레임 워크가 이미 존재합니다 (nlog, log4net, enterprise 라이브러리).

+0

답변을 주셔서 감사합니다. 프로젝트가 복잡하지 않으므로 NLog와 같은 것을 사용하는 것이 기관총을 사용하여 비행을 죽이는 것과 같습니다 :). – Danstahr

1

.NET 추적을 확인해보십시오. 나는 TraceSource 클래스에 내장 된 것을 사용하는 것보다 nlog와 같은 타사 로깅 프레임 워크를 사용하는 것을 선호한다. 이전에는 로그를 사용하여 외관을 작성하는 길을 걷기도했지만, 로그 메시지를 작성하기 위해 너무 많은 종속성과 수많은 추상화 계층을 사용하는 것이 바람직하지 않습니다. http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx

아이디어는 당신이 듣고에서 추적을 분리한다는 것입니다 :

현재 TraceSource의 개요를 볼 수 있습니다. 코드 전체에서 추적 호출을 추가 할 수 있습니다. 추적 호출은 각각 다른 로그 레벨 (오류, 자세한 정보, 디버그) 및 서로 다른 소스로 추가 할 수 있습니다. 응용 프로그램 구성에서 여러 리스너를 구성합니다.

<system.diagnostics> 
    <sources> 
     <source name="Source1" switchName="verboseSwitch"> 
     <listeners> 
      <add name="console" /> 
     </listeners> 
     </source> 
     <source name="Source2" switchName="warningSwitch"> 
     <listeners> 
      <add name="console" /> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="verboseSwitch" value="Verbose" /> 
     <add name="warningSwitch" value="Information" /> 
    </switches> 
    <sharedListeners> 
     <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/> 
    </sharedListeners> 
    <trace autoflush="true" indentsize="4"> 
     <listeners> 
     <add name="console" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 


public void MethodOne() 
{ 
    TraceSource ts = new TraceSource("Source1"); 

    ts.TraceEvent(TraceEventType.Verbose, 0, "Called MethodOne"); 

    // do something that causes an error 
    ts.TraceEvent(TraceEventType.Error, 0, "MethodOne threw an error"); 
} 

여기에서 MethodOne은 소스 "Source1"을 사용하도록 설정됩니다. Source1은 현재 Verbose 이상을 수신하도록 위에 구성되었습니다. 그래서이 MethodTwo 만 경고에 이상 듣고 설정 소스 2를 사용하도록 구성되어, 비록

Called MethodOne 
MethodOne threw an error 

이 모두

public void MethodTwo() 
{ 
    TraceSource ts = new TraceSource("Source2"); 

    ts.TraceEvent(TraceEventType.Verbose, 0, "Called MethodTwo"); 

    // do something that causes a error 
    ts.TraceEvent(TraceEventType.Error, 0, "MethodTwo threw an error"); 
} 

여기에 콘솔에 기록된다는 것을 의미합니다. 코드가 실행될 때

따라서, 출력이 당신이 할 수 있습니다 무엇

MethodTwo threw an error 

될 것입니다 당신이 프로그램의 다른 부분에 대해 표시 할 정보의 양을 제어합니다. 아마도 언젠가 어떤 라이브러리에서 오류가 발생하기 시작하면 해당 라이브러리의 추적 소스를 장황하게 설정하고 프로그램의 다른 부분의 데이터에 압도 당하지 않고 모든 디버깅 정보를 볼 수 있습니다.

중요한 오류의 흐름을 제어하기 위해 이와 같이 다른 수신기를 사용합니다.특정 소스 및 특정 오류 수준에 대한 청취자가있어 오류가 로그에 기록되는 순간 이메일로 알려줍니다. 404 오류는 신경 쓰지 않지만 예를 들어 등록 코드에서 발생하는 모든 일은 신경 써야합니다.

당신은 심지어 EventLogTraceListener

당신은 here

그런 다음 세 번째가 청취자 내장의 전체 목록을 볼 수있는 파일 에 기록 콘솔/디버그 창 FileLogTraceListener에 쓰기 위해 ConsoleTraceListener이 데이터베이스에 저장, Azure 테이블 스토리지에 쓰는 파티 리스너 등이 있습니다.

물론 이러한 모든 작업은 다음과 같은 프레임 워크로 수행 할 수 있습니다. NLog. .NET Trace 메서드는 고성능이며 .NET Framework 전체에서 사용됩니다. IMHO를 잘못 선택하면 안됩니다.