using System.Diagnostics;
using LogStudy.TraceLog;

Console.WriteLine("======== 跟踪日志学习 ========");

//UseDefaultListener();

//UseCustomListener();

//UseCustomListener2();

UseSystemListener();

Console.ReadLine();



//使用默认监听器
void UseDefaultListener()
{
	var source = new TraceSource("TraceLog", SourceLevels.All);
	var eventTypes = (TraceEventType[])Enum.GetValues(typeof(TraceEventType));
	var eventId = 1;

	source.Listeners[0].IndentLevel = 1;

	Array.ForEach(eventTypes, it =>
	{
		source.TraceEvent(it, eventId++, $"这是一个 {eventTypes} 跟踪日志信息");
	});
}

//使用自定义监听器
void UseCustomListener()
{
	var source = new TraceSource("ConsoleListenerTraceLog", SourceLevels.All);
	source.Listeners.Clear();

	var customListener = new CustomTraceListener();

	//查源码得知:Add方法会调用 InitializeListener(listener)方法,
	//在 InitializeListener 中会把 IndentLevel 及 IndentSize 重新设置为 Debug.IndentLevel 和 Debug.IndentSize
	//所以:设置 TraceListener 的 IndentLevel方法有二:
	//	1、在 TraceSource.Listeners.Add() 方法之后设置,这样可以单独设置每一个 Listener
	//	2、在 TraceSource.Listeners.Add() 方法之前,设置 Debug.IndentLevel 和 Debug.IndentSize
	var index = source.Listeners.Add(customListener);

	//放在 source.Listeners.Add 前面设置IndentLevel,add之后就自动归零,不知道什么原因。
	customListener.IndentLevel = 1;
	//或者
    //source.Listeners[index].IndentLevel = 1;

    source.TraceEvent(TraceEventType.Error, 1, $"这是一个 {TraceEventType.Error} 跟踪日志信息");
	source.TraceInformation("我是TraceInformation");
}

//使用自定义监听器2
void UseCustomListener2()
{
	var source = new TraceSource("ConsoleListenerTraceLog2", SourceLevels.All);
	source.Listeners.Clear();

	//查源码得知:Add方法会调用 InitializeListener(listener)方法,
	//在 InitializeListener 中会把 IndentLevel 及 IndentSize 重新设置为 Debug.IndentLevel 和 Debug.IndentSize
	//所以:设置 TraceListener 的 IndentLevel方法有二:
	//	1、在 TraceSource.Listeners.Add() 方法之后设置,这样可以单独设置每一个 Listener
	//	2、在 TraceSource.Listeners.Add() 方法之前,设置 Debug.IndentLevel 和 Debug.IndentSize

	Debug.IndentLevel = 3;
	source.Listeners.Add(new CustomTraceListener());

	source.TraceInformation("我是TraceInformation");

}

//使用系统监听器
void UseSystemListener()
{
	var source = new TraceSource("System.ListenerTraceLog", SourceLevels.All);
	source.Listeners.Clear();

	source.Listeners.Add(new ConsoleTraceListener());
    source.Listeners.Add(new DelimitedListTraceListener("Delimited.Trace.Log"));
    source.Listeners.Add(new XmlWriterTraceListener("Xml.Trace.Log"));

	source.TraceEvent(TraceEventType.Warning,1,"-----------------------------");

	//确认写入
	source.Flush();

}