2010-12-07 2 views
25

최근에 TraceSource에 대한 문서를 공부하고있었습니다. Microsift에 따르면 TraceSource는 새로운 방식이므로 이전 Trace 클래스 대신 사용해야합니다.클래스 전체에서 TraceSource를 사용하는 방법

// create single TraceSource instance to be used for logging 
static TraceSource ts = new TraceSource("TraceTest"); 

// somewhere in the code 
ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 

지금 내 질문. 많은 수업이있는 여러 개의 어셈블리가있는 대규모 프로젝트가 있습니다. 클래스에 걸쳐있는 특정 기능 비트를 추적하고 싶다고 가정 해보십시오. 분명한 생각은 하나의 특정 TraceSource를 만들어야한다는 것입니다.

1) Tracesource로 작업하려면 먼저 인스턴스를 만들어야합니다. MS는 다양한 클래스 나 어셈블리에서이 인스턴스를 공유하는 것에 대해 어떻게 생각합니까? 정적 싱글 톤 속성을 가진 하나의 더미 클래스를 생성해야합니까? 이 경우 뭐하고 있니?

2) 왜 TraceSource 인스턴스가 필요합니까? 모든 속성은 구성 파일에 설명되어 있습니다. Trace 클래스를 기반으로하는 오래된 논리는 인스턴스를 필요로하지 않으며 정적 메서드로만 작업 할 수있는 방법을 제공합니다.

답변

32

* 1. TraceSource를 사용하고자하는 각 클래스에서 정의하십시오. TraceSource를 정적으로 만들면 정의한 클래스의 모든 인스턴스간에 공유 할 수 있습니다. 동일한 "TraceSource"가 필요한 모든 클래스 (유형)간에 인스턴스를 공유 할 필요가 없습니다. 새로운 TraceSource (TraceSource ts = new TraceSource ("somename"); 인스턴스)를 해제 할 때마다 새 TraceSource 객체를 얻지 만 동일한 구성 정보를 참조합니다. 따라서 여러 클래스 각각에 새 TraceSource를 만들고 간단히 말해 TraceSource의 인스턴스를 클래스간에 공유하려고하지 않아도됩니다. 또한 TraceSource 인스턴스를 만들지 않아도됩니다. 정적 싱글과 더미 클래스입니다. 아래에있는 내 예. 나는 또한 TraceSources와 함께 작동하는 방법에 대해 설명합니다 여기에서 SO에 대한 몇 가지 더 많은 링크를 포함 시켰 참조하십시오. 여러 TraceSources을 사용하는 것입니다에

// 
// In this example, tracing in classes A and B is controlled by the "TraceTest" TraceSource 
// in the app.config file. Tracing in class C is controlled by the "TraceTestTwo" 
// TraceSource in the app.config. 
// 
// In addition to using different TraceSource names, you can also use SourceSwitches 
// (in the app.config). See some examples of app.config in the 
// "turning-tracing-off-via-app-config" link below. 
// 

public class A 
{ 
    private static readonly TraceSource ts = new TraceSource("TraceTest"); 

    public void DoSomething() 
    { 
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 
    } 
} 

public class B 
{ 
    // 
    //Use the same config info for TraceTest in this class 
    //It's ok to use a different instance of TraceSource, but with the same name, 
    //in this class, the new instance will be configured based on the params in the 
    //app.config file. 
    // 
    private static readonly TraceSource ts = new TraceSource("TraceTest"); 

    public void DoSomething() 
    { 
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 
    } 
} 

public class C 
{ 
    // 
    //Use a different TraceSource in this class. 
    // 
    private static readonly TraceSource ts = new TraceSource("TraceTestTwo"); 

    public void DoSomething() 
    { 
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found"); 
    } 
} 

* 2. 한 가지 장점 추적 기능을보다 세부적으로 제어 할 수 있습니다. "추적 기능 t "를 한 수준에서 (또는 전혀) 사용하지 않고"TraceTestTwo "를 통해 다른 수준에서 (또는 다시는 전혀) 사용하지 않습니다. 각 TraceSource를 자체 TraceListener로 보내거나 모두 동일한 TraceListener로 보내거나 혼합하여 일치시킬 수 있습니다. 개별 TraceSources의 구성을 조정하는 기능을 Trace 클래스의 정적 메서드 만 사용하는 제한과 비교하십시오. "추적 정보"(TraceListener (s)) 정보의 위치 또는 "추적"정보의 레벨을 구성 할 수 있지만 TraceSources를 사용할 때처럼 클래스 당 또는 기능 영역마다 레벨을 제어 할 수는 없습니다. 마지막으로, 여러 TraceSources에 대한 또 다른 이점은 출력에서 ​​얻을 수있는 "자유로운"컨텍스트 정보입니다. 기본적으로 (또는 선택적으로 기억이 나지 않습니다.) TraceListener는 메시지를 기록한 TraceSource의 이름을 기록합니다. 따라서 출력에서 ​​해당 라인을보고 호출 사이트에 컨텍스트 정보를 기록 할 필요없이 클래스 또는 기능 영역에 대한 아이디어를 얻을 수 있습니다. 위의 코드 예제에서 클래스 A와 B의 출력 추적에는 "TraceTest"태그가 지정되고 클래스 B의 추적 출력에는 "TraceTestTwo"태그가 지정됩니다.

아래의 링크 폭격을 용서해주십시오.하지만 TraceSource 및 System.Diagnostics에 대한 정보는 게시 해 두었습니다. 당신이 TraceSource를 사용하려는 경우

는 SO log4net/NLog처럼 출력 포맷에 대한 게시이 언급 라이브러리를 사용하는 것이 좋습니다 :

Does the .Net TraceSource/TraceListener framework have something similar to log4net's Formatters?

는 TraceSource 사용에 대한 자세한 정보를 원하시면 this post에 내 대답을 참조하십시오 "TraceSource 경험"을 향상시킬 수있는 방법에 대한 아이디어를 얻을 수 있습니다.TraceSource에

상세 정보 : TraceSource에 Add Trace methods to System.Diagnostics.TraceListener

상세 정보 : TraceSource에 System.Diagnostics.Debug namespace vs Other logging solutions (log4net, MS Enterprise Library, etc.)

추가 정보 :이 여러 스레드를 취한다 때 여러 tracesources를 사용 Turning tracing off via app.config

+9

이 좋지 않다. TraceSource 메서드는 잠금 메커니즘을 사용하는 스레드로부터 안전합니다. 스레드간에 하나의 TraceSource 인스턴스를 공유하면 스레드 안전 동작을 보장 할 수 있습니다. 여러 TraceSource 인스턴스를 사용하면 다른 동작이 생성됩니다. 여전히 스레드 안전하지만 thread-safety는 listner-level에 있습니다. 즉, 두 개의 스레드가 동시에 동일한 파일을 추적하는 경우 원본 파일이 잠겨 GUID 접두사가 붙은 파일 복사본이 생성됩니다. –

+3

프로덕션 코드에서 TraceSource를 많이 사용하지는 않았으며 멀티 스레드 코드에서는 훨씬 적습니다. 다음은 작성자가 UseGlobalLock 플래그를 사용하여 설명하는 블로그 게시 링크입니다. 이미 본 적이 있거나 특히 도움이 될 수도 있지만 그렇지 않을 수도 있습니다. 그의 블로그에는 System.Diagnostics를 사용하여 추적을 사용하는 몇 가지 다른 기사가 있습니다. http://www.neovolve.com/post/2009/01/08/Disable-Trace-UseGlobalLock-For-Better-Tracing-Performance.aspx – wageoghe

+0

@wageoghe, 링크가 끊어졌습니다. – Spirit

관련 문제