class Program
            {

            static void Main(string[] args)
            {
            Trace.WriteLine("program started...");
            Trace.Assert(1 != 1, "something wrong");
            //
            MasterTraceSource.TraceInformation("Trace information");
            MasterTraceSource.TraceEvent(TraceEventType.Error, 1, "Error message.");
            MasterTraceSource.TraceEvent(TraceEventType.Verbose, 2, "Warning message.");
            MasterTraceSource.Close();
            return;
            }



            private static TraceSource mySource = new TraceSource("TraceSourceApp");
            public static TraceSource MasterTraceSource
            {
            get
            {
            return mySource;
            }
            }
            }

            


            <?xml version="1.0" encoding="utf-8" ?>
            <configuration>
            <system.diagnostics>
            <sources>
            <!--
            "TraceSourceApp" is the name of TraceSource, new TraceSource("TraceSourceApp")
            switch name reference the name in source switch, it controls whether send
            the information to listners
            -->
            <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch">
            <listeners>
            <add name="consoleListner" />
            <add name="textfileListner"/>
            <remove name="Default"/>
            </listeners>
            </source>
            </sources>

            <trace autoflush="true" indentsize="4">
            <listeners>
            <add name="consoleListner" />
            <remove name="Default" />
            </listeners>
            </trace>

            <switches>
            <add name="sourceSwitch" value="Verbose"/>
            </switches>

            <sharedlisteners>
            <add name="consoleListner" type="System.Diagnostics.ConsoleTraceListener">
            <!--filter is optional, it controls whether to output info to underlining datasource-->
            <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/>
            </add>
            <add name="textfileListner" type="System.Diagnostics.TextWriterTraceListener" initializeData="textfileListner.log">
            <filter type="System.Diagnostics.EventTypeFilter" initializeData="Verbose"/>
            </add>
            </sharedListeners>



            </system.diagnostics>
            </configuration>

When you enable system.web.trace enabled ="true" requestLimit="20" writeToDiagnosticsTrace ="true " pageOutput ="false", the trace not only ouput to page or trace.axd, it will be also ouput system.diagnostic.trace listner. But it is much simpler.