可以通过外部程序集的代码配置TraceSource跟踪

时间:2015-03-20 05:47:15

标签: .net tracing tracesource

大多数TraceSource跟踪示例显示了如何通过配置完成。我试图通过代码实现这一点。

我有一个简单的程序集如下:

using System;
using System.Diagnostics;
using System.Threading;

namespace TracingLib
{
    public class AppTracer
    {
        public event EventHandler AppStarted;
        public event EventHandler AppStopped;
        private bool CancelRequested = false;
        public void Start()
        {
            Thread thread = new Thread(new ThreadStart(() =>
            {
                if(AppStarted != null) AppStarted(this, new EventArgs());

                TraceSource ts = new TraceSource("ThreadSource");

                ts.TraceInformation("Thread Begins");
                //ts.Flush();
                int i = 0;
                while (!CancelRequested)
                {

                    ts.TraceInformation("i: {0}", i++);
                    //ts.Flush();
                    Debug.Print("i : {0}", i);
                    Thread.Sleep(5000);
                }

                if (AppStopped != null) AppStopped(this, new EventArgs());
            }));
            thread.Start();
        }

        public void Stop()
        {
            CancelRequested = true;
        }
    }
}

我在控制台应用程序中使用它。

using System;
using System.Threading;
using TracingLib;

namespace caTracingLibImplementation
{
    class Program
    {
        static void Main(string[] args)
        {
            AppTracer tracer = new AppTracer();
            ManualResetEvent waiter = new ManualResetEvent(false);
            tracer.AppStopped += (sender, e) =>
            {
                waiter.Set();
            };

            TraceSource ts = new TraceSource("ThreadSource");            
            ts.Listeners.Add(new ConsoleTraceListener());
            var sw = new SourceSwitch("foo");
            sw.Level = SourceLevels.Warning;
            ts.Switch = sw;
            tracer.Start();
            Console.WriteLine("AppTracer started...");
            Thread.Sleep(10000);
            tracer.Stop();
            Console.WriteLine("AppTracer stopped...");
            Console.WriteLine("Waiting to stop...");
            waiter.WaitOne();
            Console.WriteLine("End of program");
        }
    }
}

如果我尝试通过控制台应用程序启用跟踪,则无法看到跟踪消息。

2 个答案:

答案 0 :(得分:0)

首先,您需要将TraceListeners提供给AppTracer中定义的TraceSource。

此代码可以使用配置文件,因为.NET框架保留从配置文件中获取的每个侦听器的单个实例,并根据初始字符串参数将它们分配给每个TraceSource。

如果未在app.config中定义TraceSource的字符串参数,则不会在全局状态下保存侦听器。因此,TraceSource的每个实例都必须提供所有侦听器。

TraceSource.Initialize() Source

其次,开关:sw.Level = SourceLevels.Warning;将禁用以ts.TraceInformation()

记录的任何语句

答案 1 :(得分:0)

如果您在运行时配置TraceSource,那么我认为最合适的代码解决方案是:

  1. 将动态TraceSource注入AppTracer的构造函数。
  2. 或者通过Start()传递TraceSource。
  3. 我倾向于#2而不是#2。

    如用户1112560所述,如果您的开关级别设置为警告,则不会看到TraceInformation输出。优先级为Off,Error,Warning,Information,Verbose。请参阅MSDN Trace Switches