TraceSource:自定义TraceListener无法正常工作

时间:2013-03-19 14:21:47

标签: asp.net debugging system.diagnostics tracesource

我正在使用TraceSource来记录ASP.Net应用程序。  要更改输出格式,我需要创建自己的TraceListener而不是TextwriterListener。

   <trace>
        <listeners>
            <remove name="Default" />
             <add name="Default"
             type="WebTracing.CustomTraceListener, WebTracing" initializeData="Weblog.txt" traceOutputOptions="None"/>
        </listeners>
    </trace>

 public class CustomTraceListener : TextWriterTraceListener
 {
    public override void Write(string message)
    {
        if (NeedIndent)
        {
            WriteIndent();
        }
        message = //customize format
        base.Write(message); 
    }

    public override void WriteLine(string message)
    {
        if (NeedIndent)
        {
            WriteIndent();
        }
        message = //customize format
        base.WriteLine(message);
        NeedIndent = true;
    }
 }

//调用

        CustomTraceListener obj = new CustomTraceListener();
        obj.TraceEvent(null, "This is a critical message", TraceEventType.Critical, 0);
        (or)
         obj.Write( "This is a critical message");
        obj.Close();

没有错误。输出文件中没有打印数据。   我是ASP.Net的新手,任何人都可以帮我解决这个问题。

更新


我尝试了另一种方式。但导致配置错误。

<trace autoflush="true" />
<sources>
  <source name="Trace" switchName="mySwitch" switchType="System.Diagnostics.SourceSwitch">    
      <listeners>
        <remove name="Default" />
        <add name="Default"
             type="WebTracing.CustomTraceListener, WebTracing" initializeData="Weblog.txt" traceOutputOptions="None"/>
      </listeners>      
  </source>
</sources>
<switches>
  <add name="mySwitch" value="All"/>
</switches>


        TraceSource obj = new TraceSource("Trace");
        obj.TraceEvent(TraceEventType.Critical,0,"This is a critical message");
        obj.Close();

异常详细信息:System.Configuration.ConfigurationErrorsException:无法创建WebTracing.CustomTraceListener,WebTracing。

注意:正常的TextWriterListener工作正常。但我需要自定义侦听器来格式化输出字符串。

5 个答案:

答案 0 :(得分:0)

我建议你在你的班级中添加公共修饰符

你可以使用

System.Diagnostics.Trace.Write method

答案 1 :(得分:0)

您不直接写入Trace Listener。在这种情况下,System.Diagnostic.Trace对象将写入Trace Listener。如果您使用的是TraceSources,那么您将写入跟踪源和配置文件,让TraceSource知道哪些侦听器已注册接收跟踪信息。

此外,您正在写入一个通常具有刷新间隔的文件,因此您可能希望确保它是自动刷新,或者在测试中,写入足够的数据来触发刷新(当数据写入时文件)。

答案 2 :(得分:0)

只需将您的相对路径initializeData="Weblog.txt"更改为绝对initializeData="d:\Weblog.txt"即可。我仍在尝试检测创建自定义列表日志文件对我们不起作用的根本原因。

我想这可能是因为未配置项目文件夹权限:SO link

我今天已经重现了同样的问题,我发现你的应用程序是以正确的方式配置的。我花了几个小时才明白正确的配置不足以使用自定义监听器创建日志文件

当我执行 TextWriterTraceListener 时,会在项目的文件夹中创建日志。 但 CustomTextWriterTraceListener 不会创建任何内容。

答案 3 :(得分:0)

我曾经遇到过这种情况,在<source>标记后添加了以下代码段之后,它可以按上述方式写入文本文件

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

这是 Web.config 文件

中的部分片段
<system.diagnostics>
  <trace autoflush="true"/>
  <sources>
    <source name="myTraceSource" switchName="mySwitch" switchType="System.Diagnostics.SourceSwitch" >
      <listeners>
        <clear/>
        <add name="textwriterListener" type="System.Diagnostics.TextWriterTraceListener"
          initializeData="d:\outfile1.txt" traceOutputOptions="ProcessId, DateTime, Callstack" />
      </listeners>
    </source>
  </sources>
  <switches>
    <add name="mySwitch" value="Verbose" />
  </switches>
</system.diagnostics>

此外,我在通过创建静态对象定义的某些方法内调用TraceSource

static TraceSource ts = new TraceSource("myTraceSource");
...

ts.TraceEvent(TraceEventType.Critical,0,"This is a critical message"); 

答案 4 :(得分:0)

配置和实现不匹配。

如果您将记录器配置为

<listeners>
        <remove name="Default" />
         <add name="Default"
         type="WebTracing.CustomTraceListener, WebTracing" initializeData="Weblog.txt"/>
</listeners>

您的自定义实现应该有一个匹配的公共构造函数:

public CustomTraceListener(string initializeData)
{
    //configure your listener using the initializeData value
}

其他情况会抛出ConfigurationErrorsException。