I have implemented a custom trace listener (derived from TextWriteTraceListener
) and now I would like to set my application to use it instead of standard TextWriteTraceListener
.
First I added default TextWriteTraceListener
in order to make sure it works ok and it does. Here's my app.config:
<configuration> <system.diagnostics> <trace autoflush="true" indentsize="4"> <listeners> <add name="TextListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="trace.log" /> <remove name="Default" /> </listeners> </trace> </system.diagnostics> </configuration>
Now my trace listener is defined in MyApp.Utils
namespace and it's called FormattedTextWriterTraceListener
. So I changed the type in the config above to MyApp.Utils.FormattedTextWriterTraceListener
and it currently looks like that:
<configuration> <system.diagnostics> <trace autoflush="true" indentsize="4"> <listeners> <add name="MyTextListener" type="MyApp.Utils.FormattedTextWriterTraceListener" initializeData="trace.log" /> <remove name="Default" /> </listeners> </trace> </system.diagnostics> </configuration>
However now when I try to log something I'm getting a ConfigurationErrorsException
with the message:
Couldn't find type for class MyApp.Utils.FormattedTextWriterTraceListener.
Does anyone knows how can I set up this custom listener in config and if it's even possible?
We recommend the use of application configuration files, because they let you add, modify, or remove trace listeners without having to change your code. Declare your trace listener in your application configuration file. If the listener you are creating requires any other objects, declare them as well.
You can define unlimited number of listeners, and as soon as you add them to trace listener collection, they will start receiving trace messages. . NET Framework comes with three ready-made listeners: DefaultTraceListener, EventLogTraceListener and TextWriterTraceListener (all in System.Diagnostics namespace).
The System.Diagnostics.Debug and System.Diagnostics.Trace classes send messages to objects called listeners that receive and process these messages. One such listener, the System.Diagnostics.DefaultTraceListener, is automatically created and initialized when tracing or debugging is enabled.
If you do not want your listener to receive trace output, do not add it to the Listeners collection. You can emit output through a listener independent of the Listeners collection by calling the listener's own output methods. The following example shows how to write a line to a listener that is not in the Listeners collection.
Try specifying an assembly too, like so:
<configuration> <system.diagnostics> <trace autoflush="true" indentsize="4"> <listeners> <add name="TextListener" type="MyApp.Utils.FormattedTextWriterTraceListener, MyApp" initializeData="trace.log" /> <remove name="Default" /> </listeners> </trace> </system.diagnostics> </configuration>
I've been struggling with this recently and just in case it helps anyone...
I knew my type existed so I wrote the following:
Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof("yourclassname")); Type myClassType = assembly.GetType("yournamespace.yourclassname");
In my case, myClassType.AssemblyQualifiedName contained the string I needed in my app.config file in the type attribute.
For example:
<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information,ActivityTracing" propagateActivity="true"> <listeners> <add name="CircularTraceListener" /> </listeners> </source> </sources> <sharedListeners> <add name="CircularTraceListener" type="Microsoft.Samples.ServiceModel.CircularTraceListener, CircularTraceListener, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" initializeData="C:\MyWebService\APILog\CircularTracing-service.svclog" maxFileSizeKB="1000" /> </sharedListeners> <trace autoflush="true" /> </system.diagnostics>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With