There are a number of options for diagnostic tracing in .net. Today I really wanted to trace a very specific set of API calls that sent and received JSON. I just wanted the batches of JSON, not other ‘noise’. I had a quick look around and it looked like I just wanted to write;
Trace.WriteLine(myJson, "CategoryOfJson");
Problem is that is going to get swamped with all the other data. I had a look at source, switches, listeners, etc. In the end I decided to write this filtered listener;
public class JsonTraceListener : TextWriterTraceListener
{
/// <summary>
/// The filtered category
/// </summary>
public const string Category = "JSON";
/// <summary>
/// Initializes a new instance of the class.
/// </summary>
/// The name of the file the writes to.
/// The name of the new instance.
public JsonTraceListener(string fileName, string name)
: base(fileName, name)
{
}
/// <summary>
/// WriteLine with category override will call this too, prefixed with the category text
/// </summary>
/// A message to write.
public override void WriteLine(string message)
{
if (message.StartsWith(Category))
{
base.WriteLine(message);
}
}
/// <summary>
/// Writes a category name and a message to the listener you create when you implement the class, followed by a line terminator.
/// </summary>
/// A message to write.
/// A category name used to organize the output.
public override void WriteLine(string message, string category)
{
if (category == Category)
{
base.WriteLine(message, category);
}
}
}
The listener just needs to be added and used;
var listener = new JsonTraceListener(@"C:\Logs\Json.log", "JsonListener");
listener.Filter = new EventTypeFilter(SourceLevels.All);
Trace.Listeners.Add(listener);
Trace.WriteLine("some json here", JsonTraceListener.Category);
// You must close or flush the trace to empty the output buffer.
Trace.Flush();
The code could be easily changed to allow any type of filter condition. I’m sure there is a nicer way to do this, feel free to comment.