Trace를 이용한 로깅
.NET에 내장된 Trace 클래스를 활용하여 간단한 로그를 콘솔이나 파일 혹은 이벤트 로그에 남길 수 있다. 로그를 어디에 쓸 것인가를 정하기 위해 Trace Listener 를 지정하면 되는데, .NET에서 기본적으로 몇가지의 Trace Listener들을 제공하고 있다. (주: 이러한 Trace Listener들은 Trace 클래스와 Debug 클래스 모두에서 사용할 수 있다)
DefaultTraceListener는 디버그창(OutputDebugString)에 메시지를 보내는 것으로 VS의 Output 창이나 DebugMon, DbgView 같은 도구로 로그를 볼 수 있다. TextWriterTraceListener는 TextWriter나 Stream으로 메시지를 보내는 것으로 파일에 로그를 남길 때 사용한다. ConsoleTraceListener는 콘솔에 메시지를 보낼 때 사용하며, EventLogTraceListener는 윈도우즈의 Event Log에 로그 메시지를 보낼 때 사용한다.
Trace 클래스에는 여러가지 Static 출력 메서드들이 있는데, Trace.Write(), Trace.WriteLine() 등과 같은 기본 메서드들를 비롯하여 에러를 출력하는 TraceError(), 경고를 출력하는 TraceWarning(), 그리고 Info를 출력하는 TraceInformation() 등을 사용할 수 있다.
아래 예제는 콘솔과 파일 그리고 이벤트로그에 간단한 메시지를 로깅하는 코드이다.
DefaultTraceListener는 디버그창(OutputDebugString)에 메시지를 보내는 것으로 VS의 Output 창이나 DebugMon, DbgView 같은 도구로 로그를 볼 수 있다. TextWriterTraceListener는 TextWriter나 Stream으로 메시지를 보내는 것으로 파일에 로그를 남길 때 사용한다. ConsoleTraceListener는 콘솔에 메시지를 보낼 때 사용하며, EventLogTraceListener는 윈도우즈의 Event Log에 로그 메시지를 보낼 때 사용한다.
Trace 클래스에는 여러가지 Static 출력 메서드들이 있는데, Trace.Write(), Trace.WriteLine() 등과 같은 기본 메서드들를 비롯하여 에러를 출력하는 TraceError(), 경고를 출력하는 TraceWarning(), 그리고 Info를 출력하는 TraceInformation() 등을 사용할 수 있다.
아래 예제는 콘솔과 파일 그리고 이벤트로그에 간단한 메시지를 로깅하는 코드이다.
예제
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// 1. DefaultTraceListener 사용. VS Output 창에 로깅
Trace.WriteLine("Default Logging");
// 2. 콘솔에 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Console Log");
// 3. 파일에 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new TextWriterTraceListener("Logs.txt"));
Trace.AutoFlush = true;
Trace.WriteLine("File Log");
//Trace.Flush(); // AutoFlush 하지 않으면 수동으로 Flush 할 것
// 4. EventLog에 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new EventLogTraceListener("Application"));
Trace.WriteLine("My Event Log");
// 5. 콘솔과 파일에 동시 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new TextWriterTraceListener("Logs.txt"));
Trace.AutoFlush = true;
// Trace*() 메서드들 사용
Trace.TraceInformation("My Info");
Trace.TraceWarning("My Warning");
Trace.TraceError("My Error");
}
}
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// 1. DefaultTraceListener 사용. VS Output 창에 로깅
Trace.WriteLine("Default Logging");
// 2. 콘솔에 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Console Log");
// 3. 파일에 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new TextWriterTraceListener("Logs.txt"));
Trace.AutoFlush = true;
Trace.WriteLine("File Log");
//Trace.Flush(); // AutoFlush 하지 않으면 수동으로 Flush 할 것
// 4. EventLog에 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new EventLogTraceListener("Application"));
Trace.WriteLine("My Event Log");
// 5. 콘솔과 파일에 동시 로깅
Trace.Listeners.Clear();
Trace.Listeners.Add(new ConsoleTraceListener());
Trace.Listeners.Add(new TextWriterTraceListener("Logs.txt"));
Trace.AutoFlush = true;
// Trace*() 메서드들 사용
Trace.TraceInformation("My Info");
Trace.TraceWarning("My Warning");
Trace.TraceError("My Error");
}
}
App.config를 사용한 Trace 로깅
위와 같이 C#에서 Trace Listener들을 직접 지정하는 대신 App.config 같은 구성파일에 사용할 Trace Listener들을 설정할 수도 있다. 이렇게 하면 프로그램을 재컴파일하지 않고 쉽게 사용할 Trace Listener들을 변경할 수 있는 장점이 있다.
구성파일을 사용하기 위해서는 아래 예제와 같이 system.diagnostics 노드 밑에 trace와 listeners 노드를 만들고 그 밑에 사용하고자 하는 Trace Listener들을 추가하면 된다. 아래는 콘솔과 파일 출력에 Trace 메시지를 출력하도록 App.config를 설정한 예이다.
구성파일을 사용하기 위해서는 아래 예제와 같이 system.diagnostics 노드 밑에 trace와 listeners 노드를 만들고 그 밑에 사용하고자 하는 Trace Listener들을 추가하면 된다. 아래는 콘솔과 파일 출력에 Trace 메시지를 출력하도록 App.config를 설정한 예이다.
예제
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener" />
<add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logs.txt" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
<configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener" />
<add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logs.txt" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
TraceSource를 사용한 로깅
.NET의 Trace Listener가 메시지를 받는 쪽이라면, 메시지를 보내는 쪽은 Trace Source에 해당된다. .NET의 TraceSource 클래스는 로그 메시지를 보낼 수 있는 소스를 생성하고 사용할 수 있는 클래스이다. TraceSource 를 사용하기 위해서는 먼저 TraceSource 객체를 생성해야 하는데, 생성시 Trace 소스명을 파라미터로 지정한다. 아래 예제에선 MyTrace라는 이름의 TraceSource 객체를 생성하였다.
TraceSource 객체를 생성하였으면, 이 객체의 메서드인 TraceEvent(), TraceInformation(), TraceData() 등을 사용하여 로그 메시지를 출력할 수 있다. 특히, 이 메서드들 중 TraceEvent() 혹은 TraceData()는 다양한 TraceEventType을 지정할 수 있는데, 이벤트 타입으로는 Critical, Error, Warning, Information, Verbose, Start, Stop, Suspend, Resume, Transfer 등이 있다.
TraceSource 에서 메시지를 보낼 때, 이를 받는 쪽 즉 Trace Listener을 또한 지정해 주어야 하는데, 이는 TraceSource의 Listeners 속성에 직접 추가하거나 혹은 App.config 파일에 아래 예제에서와 같이 Trace Listener들을 지정할 수 있다.
아래 예제는 간단한 로그 메시지를 TraceSource를 사용하여 Logs.txt 파일에 저장하는 예이다.
TraceSource 객체를 생성하였으면, 이 객체의 메서드인 TraceEvent(), TraceInformation(), TraceData() 등을 사용하여 로그 메시지를 출력할 수 있다. 특히, 이 메서드들 중 TraceEvent() 혹은 TraceData()는 다양한 TraceEventType을 지정할 수 있는데, 이벤트 타입으로는 Critical, Error, Warning, Information, Verbose, Start, Stop, Suspend, Resume, Transfer 등이 있다.
TraceSource 에서 메시지를 보낼 때, 이를 받는 쪽 즉 Trace Listener을 또한 지정해 주어야 하는데, 이는 TraceSource의 Listeners 속성에 직접 추가하거나 혹은 App.config 파일에 아래 예제에서와 같이 Trace Listener들을 지정할 수 있다.
아래 예제는 간단한 로그 메시지를 TraceSource를 사용하여 Logs.txt 파일에 저장하는 예이다.
예제
using System;
using System.Diagnostics;
class Program
{
// TraceSource 생성
private static TraceSource traceSource = new TraceSource("MyTrace");
static void Main(string[] args)
{
// TraceSource 사용
traceSource.TraceEvent(TraceEventType.Start, 0, "Main Start");
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
traceSource.TraceInformation("msg#" + i.ToString());
}
traceSource.TraceEvent(TraceEventType.Stop, 0, "Main End");
traceSource.Flush();
}
}
/* App.config */
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<sources>
<source name="MyTrace" switchValue="All">
<listeners>
<add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logs.txt" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
using System.Diagnostics;
class Program
{
// TraceSource 생성
private static TraceSource traceSource = new TraceSource("MyTrace");
static void Main(string[] args)
{
// TraceSource 사용
traceSource.TraceEvent(TraceEventType.Start, 0, "Main Start");
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
traceSource.TraceInformation("msg#" + i.ToString());
}
traceSource.TraceEvent(TraceEventType.Stop, 0, "Main End");
traceSource.Flush();
}
}
/* App.config */
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<sources>
<source name="MyTrace" switchValue="All">
<listeners>
<add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logs.txt" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>