【问题标题】:TraceSource : Custom TraceListener not workingTraceSource:自定义 TraceListener 不起作用
【发布时间】:2013-03-19 14:21:47
【问题描述】:

我正在使用 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 工作正常。但我需要自定义侦听器来格式化输出字符串。

【问题讨论】:

  • 你有没有偶然解决它?

标签: asp.net debugging system.diagnostics tracesource


【解决方案1】:

我建议你在你的类中添加 public 修饰符

你可以使用

System.Diagnostics.Trace.Write method

【讨论】:

  • 很高兴为您提供帮助,但您检查了输出窗口
  • Trace.write() 显示在输出窗口中。不在文件中。正常的 TextWriterListener 与 TraceSource 一起工作正常。但我需要 CustomListener 扩展 TextWriterListener 以格式化输出。请参阅我的更新。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回复。如果我使用 System.Diagnostic.Trace 它不会触发我的 customListener 的覆盖方法,并且显然它不会在输出文件中写入任何内容。请参阅我尝试使用 TraceSource 的更新,它适用于 Default textwriterListener 但不适用于 customListener。
  • 另一种可能是类型错误。有时您必须摆弄程序集和类型。 codeproject.com/Tips/352679/… 抱歉,我没有时间创建示例应用程序并测试我的理论。
【解决方案3】:

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

我猜这可能是因为没有配置项目文件夹权限:SO link


我今天重现了同样的问题,我发现您的应用程序配置正确。我花了几个小时才明白正确的配置并不是使用自定义侦听器创建日志文件的充分条件

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


【讨论】:

    【解决方案4】:

    我曾经遇到过这种情况,在&lt;source&gt; 标记之后添加以下代码 sn-ps 后,它可以如上所述写入文本文件

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

    这是 Web.config 文件中的部分 sn-ps

    <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"); 
    

    【讨论】:

      【解决方案5】:

      配置和实现不匹配。

      如果您将记录器配置为

      <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。

      【讨论】:

        猜你喜欢
        • 2014-07-03
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 2010-11-13
        • 2014-08-21
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多