Click here to Skip to main content
15,885,546 members
Articles / Programming Languages / C#

TraceListeners and Reflection

Rate me:
Please Sign up or sign in to vote.
4.94/5 (57 votes)
3 Mar 2003Ms-PL12 min read 214.1K   1.4K   123  
This article explains extending TraceListeners using Reflection.
	using System;
	using System.Diagnostics;
	using System.Text;
	using System.Reflection;

namespace Dennany.Diagnostics {
	
	
	public class CustomTraceListener : TextWriterTraceListener { 
	
		// for our constructors, explicitly call the base class constructor.
		public CustomTraceListener( System.IO.Stream stream, string name ) :
			base(stream, name) { }
		public CustomTraceListener( System.IO.Stream stream) : 
			base(stream) { }
		public CustomTraceListener( string fileName, string name ) : 
			base(fileName, name) {	}
		public CustomTraceListener( string fileName ) : 
			base(fileName) { }
		public CustomTraceListener( System.IO.TextWriter writer, string name ) : 
			base(writer, name) { }
		public CustomTraceListener( System.IO.TextWriter writer ) : 
			base(writer) { }

	
		public override void Write( string message ) {	
			
			base.Write( getPreambleMessage() + message );
		}

		public override void WriteLine( string message ) {	
		 
			base.WriteLine( getPreambleMessage() + message );
		} 

		
		[System.Runtime.CompilerServices.MethodImpl(
			 System.Runtime.CompilerServices.MethodImplOptions.NoInlining )]
		private string getPreambleMessage() {
			
			StringBuilder preamble = new StringBuilder();
			
			StackTrace stackTrace = new StackTrace();
			StackFrame stackFrame;
			MethodBase stackFrameMethod;

			int frameCount = 0;
			string typeName;
			do {
				frameCount++;
				stackFrame	= stackTrace.GetFrame(frameCount);
				stackFrameMethod = stackFrame.GetMethod();
				typeName = stackFrameMethod.ReflectedType.FullName;
			} while ( typeName.StartsWith("System") || typeName.EndsWith("CustomTraceListener") );
			
			//log DateTime, Namespace, Class and Method Name
			preamble.Append(DateTime.Now.ToString());
			preamble.Append(": ");
			preamble.Append(typeName);
			preamble.Append(".");
			preamble.Append(stackFrameMethod.Name);
			preamble.Append("( ");
		
			// log parameter types and names
			ParameterInfo[] parameters = stackFrameMethod.GetParameters();
			int parameterIndex = 0;
			while( parameterIndex < parameters.Length ) {
				preamble.Append(parameters[parameterIndex].ParameterType.Name);
				preamble.Append(" ");
				preamble.Append(parameters[parameterIndex].Name);
				parameterIndex++;
				if (parameterIndex != parameters.Length ) preamble.Append(", ");
			}
				
			preamble.Append(" ): ");

			return preamble.ToString();
		
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


Written By
Web Developer
United States United States
Jerry Dennany is a software engineer in the Atlanta, Georgia area. He regularly blogs at http://weblogs.asp.net/jdennany.

Comments and Discussions