3

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

4

5 回答 5

0

我建议您将 public 修饰符添加到您的课程中

你可以使用

System.Diagnostics.Trace.Write method
于 2013-03-19T14:35:13.773 回答
0

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

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

于 2013-03-19T15:42:08.843 回答
0

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

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


我今天重现了同样的问题,我看到您的应用程序配置正确。我花了几个小时才明白,正确的配置并不是使用 custom-listeners 创建日志文件的充分条件

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


于 2016-03-05T23:20:32.757 回答
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。

于 2021-05-19T09:42:29.323 回答
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"); 
于 2019-10-28T13:42:24.027 回答