大多数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");
}
}
}
如果我尝试通过控制台应用程序启用跟踪,则无法看到跟踪消息。
答案 0 :(得分:0)
首先,您需要将TraceListeners提供给AppTracer中定义的TraceSource。
此代码可以使用配置文件,因为.NET框架保留从配置文件中获取的每个侦听器的单个实例,并根据初始字符串参数将它们分配给每个TraceSource。
如果未在app.config中定义TraceSource的字符串参数,则不会在全局状态下保存侦听器。因此,TraceSource的每个实例都必须提供所有侦听器。
TraceSource.Initialize() Source
其次,开关:sw.Level = SourceLevels.Warning;
将禁用以ts.TraceInformation()
答案 1 :(得分:0)
如果您在运行时配置TraceSource,那么我认为最合适的代码解决方案是:
我倾向于#2而不是#2。
如用户1112560所述,如果您的开关级别设置为警告,则不会看到TraceInformation输出。优先级为Off,Error,Warning,Information,Verbose。请参阅MSDN Trace Switches。