C# - Trace

Trace 클래스

  • 코드 실행을 추적하는 데 필요한 메서드 및 속성 집합을 제공
  • 네임스페이스: System.Diagnostics
  • 어셈블리: System(system.dll)
  • Trace 클래스의 속성 및 메서드를 사용하여 릴리스 빌드를 측정 할 수 있다. 이렇게 하면 실제 설정에서 실행되는 응용 프로그램의 상태를 모니터링할 수 있다. 추적 기능을 이용하여 실행 중인 시스템에 영향을 주지 않고 문제를 확인하여 해결할 수 있다.
    • C#에서 추적을 활성화하려면 코드를 컴파일할 때 /d:TRACE 플래그를 컴파일러 명령줄에 추가하거나, #define TRACE를 파일 맨 위에 추가한다.
  • BooleanSwitch 및 TraceSwitch 클래스는 추적 출력을 동적으로 제어하는 방법을 제공한다. 응용 프로그램을 다시 컴파일하지 않고도 이들 스위치 값을 수정할 수 있다.
  • Listeners 컬렉션에서 TraceListener 인스턴스를 추가하거나 제거하여 추적 출력 대상을 사용자 지정할 수 있다. 기본적으로 DefaultTraceListener 클래스를 사용하여 추적 출력을 내보낸다.
  • Trace 클래스는 Indent 및 IndentSize 수준과 각 쓰기 직후의 AutoFlush 호출 여부를 가져오거나 설정하는 속성을 제공한다.
    • Trace의 AutoFlush 및 IndentSize를 설정하려면 응용 프로그램 이름과 일치하는 구성 파일을 편집한다. 구성 파일의 형식은 다음 예제와 같아야 한다.
<configuration>
  <system.diagnostics>
	<trace autoflush="false" indentsize="3" />
  </system.diagnostics>
</configuration>

TraceSwitch 클래스

  • 코드를 다시 컴파일하지 않고 추적 및 디버그 출력을 제어하는 여러 수준의 스위치를 제공한다
  • 추적 스위치를 사용하여 메시지를 중요도에 따라 필터링할 수 있다.
  • TraceSwitch 클래스는 스위치의 수준을 테스트하는 TraceError, TraceWarning, TraceInfo 및 TraceVerbose 속성을 제공한다.
    • Level 속성은 스위치의 TraceLevel을 가져오거나 설정한다.
  • 응용 프로그램 구성 파일을 통해 TraceSwitch의 수준을 설정한 다음 응용 프로그램에서 구성된 TraceSwitch 수준을 사용할 수 있다. 또는 코드에서 TraceSwitch를 만들고 수준을 직접 설정하여 코드의 특정 섹션을 조정할 수 있다.
  • TraceSwitch를 구성하려면 응용 프로그램의 이름에 해당하는 구성 파일을 편집한다. 이 파일에서 스위치를 추가 또는 제거하거나, 스위치 값을 설정하거나, 응용 프로그램에서 이전에 설정한 모든 스위치를 지울 수 있다. 구성 파일의 형식은 다음 예제와 같아야 합니다.
<configuration>
  <system.diagnostics>
	<switches>
	  <add name="mySwitch" value="1" />
	</switches>
  </system.diagnostics>
</configuration>
private static TraceSwitch appSwitch = new TraceSwitch("mySwitch", "Switch in config file");

public static void Main(string[] args) 
{
	//...
	Console.WriteLine("Trace switch {0} configured as {1}", 
	appSwitch.DisplayName, appSwitch.Level.ToString());
	if (appSwitch.TraceError)
	{
		//...
	}
}
  • 다음 코드 예제에서는 새 TraceSwitch를 만들고 해당 스위치를 사용하여 오류 메시지의 출력 여부를 결정한다
//Class-level declaration.
 /* Create a TraceSwitch to use in the entire application.*/
 static TraceSwitch mySwitch = new TraceSwitch("General", "Entire Application");

 static public void MyMethod() {
	// Write the message if the TraceSwitch level is set to Error or higher.
	if(mySwitch.TraceError)
	   Console.WriteLine("My error message.");

	// Write the message if the TraceSwitch level is set to Verbose.
	if(mySwitch.TraceVerbose)
	   Console.WriteLine("My second error message.");
 }

 public static void Main(string[] args) {
	// Run the method that prints error messages based on the switch level.
	MyMethod();
 }
  • 성능을 향상시키려면 클래스에서 TraceSwitch 멤버를 static으로 설정합니다.

TraceLevel 열거형

  • Debug, Trace 및 TraceSwitch 클래스에 출력할 메시지를 지정한다
  • public enum TraceLevel
<configuration>
	 <system.diagnostics>
		<switches>
		   <add name="mySwitch" value="4" />
		</switches>
	 </system.diagnostics>
 </configuration>
Off (0)		추적 및 디버깅 메시지를 출력하지 않습니다.
Error (1)	오류 처리 메시지를 출력합니다.
Warning (2)	경고 및 오류 처리 메시지를 출력합니다.
Info (3)	정보 메시지, 경고 및 오류 처리 메시지를 출력합니다.
Verbose (4)	디버깅 및 추적 메시지를 모두 출력합니다.

TraceListener의 종류

  • TextWriterTraceListener
  • EventLogTraceListener
  • DefaultTraceListener
  • ConsoleTraceListener
  • DelimitedListTraceListener
  • XmlWriterTraceListener

BooleanSwitch

  • 디버그 및 트래이스 출력 유무를 제어 할 수 있다.
<configuration>
  <system.diagnostics>
	<switches>
	  <add name="mySwitch" value="1"/>
	</switches>
  </system.diagnostics>
</configuration>
  • 코드로 제어
BooleanSwitch mySwitch = new BooleanSwitch("mySwitch", "Sample of BooleanSwitch");
if ( mySwitch.Enabled )
	 Trace.WriteLine("Switch on");

예제. 프로그램 실행의 시작과 끝을 보기

  • 이 예제에서는 Indent 및 Unindent를 사용하여 추적 출력을 구분한다
static int Main(string[] args)
{
   Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
   Trace.AutoFlush = true;
   Trace.Indent();
   Trace.WriteLine("Entering Main");
   Console.WriteLine("Hello World.");
   Trace.WriteLine("Exiting Main"); 
   Trace.Unindent();
   return 0;
}

예제. 파일로 남기기

  • 출처: http://blog.naver.com/manylee0/110010057717
// Global.cs
using System;
using System.Diagnostics;

namespace SFSecsUnitTest
{
	static class Global
	{
		static TraceSource debugTraceSource;
		static Global()
		{
			Trace.AutoFlush = true; // turn on auto flush

			debugTraceSource = new TraceSource("SFSecsUnitTest"); 
			debugTraceSource.Switch.Level = SourceLevels.All;

			TraceListener listener = new TextWriterTraceListener(
										@"c:\SFSecsUnitTest.trace", "TextWriterListener");
			listener.TraceOutputOptions = TraceOptions.DateTime |
                                                                TraceOptions.Callstack |
                                                                TraceOptions.ThreadId |
                                                                TraceOptions.Timestamp;

			debugTraceSource.Listeners.Add(listener);
		}
		public static TraceSource DebugTraceSource
		{
			get
			{
				return debugTraceSource;
			}
		}
	}
}

// GlobalTest.cs (unit test)

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Diagnostics;

namespace SFSecsUnitTest
{
	[TestClass]
	public class GlobalTest
	{
		[TestMethod]
		public void TestMethod1()
		{
			Global.DebugTraceSource.TraceEvent(TraceEventType.Verbose, 1,"GlobalTest.TestMethod1() - Enter");

		}
	}
}

닷넷 네트워크 라이브러리의 트레이스 기능

  • http://www.sysnet.pe.kr/2/0/1074

이 글은 2019-03-07에 작성되었습니다.