Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a default TraceListener for all TraceSources in App.config

How can I define a default TraceListener, that is automatically added to all TraceSources, in a net 4.0 c# project?

Currently I have to list every named TraceSource I use in the App.config file like this:

  <system.diagnostics>
  <sharedListeners>
      <add name="MyListener" type="MyListenerType,MyAssemblyName" />
  </sharedListeners>
    <sources>
      <source name="Class1" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      <source name="Class2" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      <source name="Class3" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      ... repeat for a gazillion classes ...
    </sources>
  <system.diagnostics>

I am using a SharedListener that should receive all outputs from all TraceSources, unless otherwise specified. With the above syntax, this requires a manual entry for each TraceSource.

Whenever I introduce a new class with a new TraceSource, I have to update the App.Config. If multiple programs use that assembly, I have to update multiple App.Config. A spelling mistake while updating these entries will not produce any error, it will just silently omit all trace output from the correct source.

Is there a way I can set a default TraceListener via App.config, so that I only have to name specific TraceSources if I want to deviate from the default?

like image 817
HugoRune Avatar asked Jul 01 '14 11:07

HugoRune


2 Answers

I didn't find a great solution to this, so what I did was at least centralize the creation of TraceSources. Then I can add any of the 'trace' listeners in app.config to these newly created sources:

TraceSource toReturn = new TraceSource(name, filterLevel);

//remove the default trace listener; don't 'clear' the listeners entirely, because that would undo changes made in app.config; this is a decent compromise
toReturn.Listeners.Remove("Default");

//add all global trace listeners from the app.config
toReturn.Listeners.AddRange(Trace.Listeners);

return toReturn;

Now any listeners I add to <system.diagnostics> \ <trace> \ <listeners> will be added to all trace sources I create with this code.

like image 162
Mark Sowul Avatar answered Oct 20 '22 11:10

Mark Sowul


You could add a default listener in the machine config, but that would affect more apps than you want to affect.

like image 1
MatthewMartin Avatar answered Oct 20 '22 10:10

MatthewMartin