using System.Diagnostics;

namespace LogStudy.TraceLog.Next
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("跟踪日志学习-进阶项目");

            Test();

            DefaultTraceSource();
            DefaultTraceSourceWithLog();
            DefaultTraceSourceWithoutSourceLevels();

            UseDelimitedTraceListener();

            Console.WriteLine("按回车键,退出程序!");
            Console.ReadLine();
        }

        static void Test()
        {
            TraceSource traceSource = new TraceSource("Test",SourceLevels.All);
            traceSource.Listeners.Add(new ConsoleTraceListener());

            var preMessaage = traceSource.Name + ": ";

            traceSource.TraceData(TraceEventType.Verbose, 1, $"{preMessaage}================");
            traceSource.TraceEvent(TraceEventType.Error, 1, $"{preMessaage}---------------");
            traceSource.TraceInformation($"{preMessaage}++++++++++++++++++++++++++++++++++++++++++++++");
            traceSource.TraceTransfer(2, $"{preMessaage}************", Guid.NewGuid());
        }

        /// <summary>
        /// 使用默认 SourceLevels 参数的 TraceSource
        /// 因为 SourceLevels 默认为Off,所以使用默认不传SourceLevels参数的构建函数生成的 TraceSource 是不会输出任何跟踪信息的。
        /// </summary>
        static void DefaultTraceSourceWithoutSourceLevels()
        {
            TraceSource defaultTraceSource = new TraceSource("Andy-DefaultTraceSourceWithoutSourceLevels");

            var preMessaage = defaultTraceSource.Name + ": ";

            defaultTraceSource.TraceData(TraceEventType.Verbose, 1, $"{preMessaage}================");
            defaultTraceSource.TraceEvent(TraceEventType.Error, 1, $"{preMessaage}---------------");
            defaultTraceSource.TraceInformation($"{preMessaage}++++++++++++++++++++++++++++++++++++++++++++++");
            defaultTraceSource.TraceTransfer(2, $"{preMessaage}************", Guid.NewGuid());

            //强制输出
            defaultTraceSource.Flush();
        }

        /// <summary>
        /// 默认 TraceSource
        /// </summary>
        static void DefaultTraceSource()
        {
            TraceSource defaultTraceSource = new TraceSource("Andy-DefaultTraceSource", SourceLevels.All);

            var preMessaage = defaultTraceSource.Name + ": ";

            defaultTraceSource.TraceData(TraceEventType.Verbose, 1, $"{preMessaage}================");
            defaultTraceSource.TraceEvent(TraceEventType.Error, 1, $"{preMessaage}---------------");
            defaultTraceSource.TraceInformation($"{preMessaage}++++++++++++++++++++++++++++++++++++++++++++++");
            defaultTraceSource.TraceTransfer(2, $"{preMessaage}************", Guid.NewGuid());

            //强制输出
            defaultTraceSource.Flush();
        }

        /// <summary>
        /// 默认跟踪源:内容输出到日志文件
        /// </summary>
        static void DefaultTraceSourceWithLog()
        {
            TraceSource defaultTraceSource = new TraceSource("Andy-DefaultTraceSourceWithLog", SourceLevels.All);
            defaultTraceSource.Listeners.Clear();

            defaultTraceSource.Listeners.Add(new DefaultTraceListener() { LogFileName = "DefaultTraceListener.log" });

            var preMessaage = defaultTraceSource.Name+": ";

            defaultTraceSource.TraceData(TraceEventType.Verbose, 1, $"{ preMessaage }================");
            defaultTraceSource.TraceEvent(TraceEventType.Error, 1, $"{ preMessaage }---------------");
            defaultTraceSource.TraceInformation($"{ preMessaage }++++++++++++++++++++++++++++++++++++++++++++++");
            defaultTraceSource.TraceTransfer(2, $"{ preMessaage }************", Guid.NewGuid());

            //强制输出
            defaultTraceSource.Flush();
        }

        /// <summary>
        /// 使用默认TraceListener
        /// </summary>
        static void UseDefaultTraceListener()
        {

        }

        /// <summary>
        /// 使用 TextWriterTraceListener
        /// </summary>
        static void UseTextWriterTraceListener()
        {

        }

        /// <summary>
        /// 使用 ConsoleTraceListener
        /// </summary>
        static void UseConsoleTraceListener()
        {

        }

        /// <summary>
        /// 使用 DelimitedTraceListener
        /// </summary>
        static void UseDelimitedTraceListener()
        {
            var listener = new DelimitedListTraceListener("trace.csv")
            {
                //控制输出内容
                TraceOutputOptions = TraceOptions.LogicalOperationStack|TraceOptions.DateTime|TraceOptions.Timestamp|TraceOptions.ProcessId|TraceOptions.ThreadId|TraceOptions.Callstack,
                Delimiter= ",",
            };


            TraceSource traceSource = new TraceSource("UseDelimitedTraceListener", SourceLevels.All);
            var listenerIndex = traceSource.Listeners.Add(listener);
            traceSource.Listeners[listenerIndex].IndentLevel= 1;

            var preMessaage = traceSource.Name + ": ";

            traceSource.TraceData(TraceEventType.Verbose, 1, $"{preMessaage}================");
            traceSource.TraceEvent(TraceEventType.Error, 1, $"{preMessaage}---------------");
            traceSource.TraceInformation($"{preMessaage}++++++++++++++++++++++++++++++++++++++++++++++");
            traceSource.TraceTransfer(2, $"{preMessaage}************", Guid.NewGuid());

            traceSource.Flush();
        }

        /// <summary>
        /// 使用 XmlTraceListener
        /// </summary>
        static void UseXmlTraceListener()
        {

        }

        /// <summary>
        /// 使用静态 Trace 类
        /// </summary>
        static void UseTarce()
        { 
            
        }
    }
}