2015-03-20 7 views
0

Большинство примеров 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"); 
     } 
    } 
} 

Если я пытаюсь включить отслеживание через консольное приложение, я не вижу сообщения трассировки.

+0

После того, как вы получите ссылку на список внутренних трассировщиков (по 1 на AppDomain), вы можете делать все, что хотите (это обычно делается при запуске через конфигурацию), этот код иллюстрирует технику, я посмотрю, если я может создать пример woking: https://stackoverflow.com/questions/23664573/tracesource-and-tracelistener-quietly-fail-to-do-anything/23664574#23664574 – MatthewMartin

ответ

0

Во-первых, вам необходимо предоставить TraceListeners в TraceSource, определенный в AppTracer.

Этот код будет работать с использованием файлов конфигурации, потому что .NET framework хранит один экземпляр каждого слушателя, полученный из файла конфигурации, и назначает их каждому TraceSource на основе исходного параметра строки.

Если параметр string для TraceSource не указан в app.config, то в глобальном состоянии не будет прослушивателей. Поэтому каждый экземпляр TraceSource должен иметь все слушатели, предоставленные ему.

TraceSource.Initialize() Source

Во-вторых, переключатель: sw.Level = SourceLevels.Warning; отключит любые заявления регистрируемые с: ts.TraceInformation()

+0

именно «что» читает файл конфигурации для включения трассировка через tracesource? – deostroll

+0

Лучше всего прочитать связанный источник для наиболее полного объяснения. sourceElement.Listeners - это место, где происходит волшебство. – user1112560

+0

Я предполагаю, что единственный вариант, с которым я остаюсь, заключается в том, чтобы открыть объект TraceSource из AppTracer и добавить к нему слушателей из исполняющей сборки ... – deostroll

0

Если вы настраиваете TraceSource во время выполнения, то я думаю, что наиболее подходящее решение для вашего кода заключается в следующем:

  1. Внесите этот динамический TraceSource в конструктор AppTracer.
  2. ИЛИ передайте источник TraceSource через Start().

Я бы наклонился к № 1 над №2.

Как пользователь1112560 упоминает, вы не увидите вывод TraceInformation, если для вашего уровня переключателя установлено значение Warning. Приоритет: Off, Error, Warning, Information, Verbose. См. MSDN Trace Switches.