将自定义的TextWriterTraceListener配置到web.config文件中

4

我看到了两个关于这个主题的答案,但是我无法弄清楚。我有一个自定义的TextWriterTraceListener,并且我希望将其用于我的跟踪源。

 namespace MyTraceLogger
 {
 public class MyTextTraceListener : TextWriterTraceListener
    {

        public override void Write(string message)
        {
            this.Write(string.Format("{0},{1}",
                          DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                          message));
        }

        public override void WriteLine(string message)
        {
            this.WriteLine(string.Format("{0},{1}",
                          DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                          message));
        }
    }

}

 <system.diagnostics>
<sources>
  <source name="SpendingTrace" switchName="SpendingSourceSwitch" switchType="System.Diagnostics.SourceSwitch" >
    <listeners>
      <add name="Spending" type="MyTraceLogger.MyTraceLogger.MyTextTraceListener,MyTraceLogger.MyTraceLogger" initializeData="Spending.log" />
      <remove name ="Default" />

    </listeners>
  </source>

</sources>
<switches>
  <!-- You can set the level at which tracing is to occur -->
  <add name="SpendingSourceSwitch" value="Warning" />
  <!-- You can turn tracing off -->
  <!--add name="SourceSwitch" value="Off" -->

</switches>
<trace autoflush="true" indentsize="4"></trace>

这是我收到的错误信息:找不到MyTraceLogger.MyTraceLogger.MyTextTraceListener,MyTraceLogger.MyTraceLogger类的类型。
右键单击MyTraceLogger项目属性时,程序集显示为MyTraceLogger,命名空间也显示为MyTraceLogger。

发现了为什么会有混乱的MyTraceLogger.MyTraceLogger,原来它是嵌套在MyTraceLogger类中的。我将其提取出来,并将配置设置为MyTraceLogger.MyTextTraceListener, MyTraceLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null。现在出现了错误Could not create MyTraceLogger.MyTextTraceListener, MyTraceLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null。另一篇帖子说要重载一个构造函数。我不知道该重载哪个构造函数,所以我尝试了这个:public MyTextTraceListener() : base() { },但依然报错。 - Hieu N Trinh
我尝试公开MyTextTraceListener(string name) : base(name) { }并进行调试,我看到它传递的字符串是我的日志名称,但似乎这个构造函数被调用了2或3次,之后我得到了stackoverflow错误。 - Hieu N Trinh
我偶然发现了这篇文章。http://nicholas.piasecki.name/blog/2009/03/on-textwritertracelistener-inheritance-initializedata-aspnet-and-paths/ - Hieu N Trinh
2个回答

4

为什么要使用配置文件而不是在代码中本地实例化?这样做可以避免配置文件在未来的开发和维护中被混淆、移动或错误使用。

创建 MyTextTraceListener 的实例并将其添加到跟踪侦听器中:

    MyTextTraceListener myTraceListener = new MyTextTraceListener ("application.log");
    Trace.Listeners.Add(myTraceListener);

请参考此帖:如何在app.config中定义自定义TraceListener

我想在特定的时间控制日志记录的类型,例如只记录错误、警告或信息日志。 - Hieu N Trinh
仔细看一下我的答案,它完全做到了配置所做的事情,只是以一种更简单和可控的方式。使用声明实例方法可以获得相同的行为。 - sonne
我还没有尝试过那种方法,但如果我想要更改日志名称,我可能可以使用appsetting添加密钥。如果可能的话,我仍然想使用配置方式来学习。 - Hieu N Trinh
实现一个字符串参数,您可以根据需要更改该参数以生成日志文件名。 - sonne

0

为什么要把命名空间写两遍?我认为你只需要:

<add name="Spending" type="MyTraceLogger.MyTextTraceListener,MyTraceLogger" initializeData="Spending.log" />

我认为你需要其中的程序集名称和命名空间名称。不过,我已经尝试了你建议的那个,出现了相同的错误。 - Hieu N Trinh
你可以使用typeof(MyTraceLogger).AssemblyQualifiedName获取正确的字符串。 - John
这是它的输出结果:MyTraceLogger.MyTraceLogger,MyTraceLogger,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null。然后我在web.config中将其更改为:MyTraceLogger.MyTraceLogger.TextWriterTraceListener,MyTraceLogger,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null。仍然是相同的错误。 - Hieu N Trinh
您的应用程序名称和程序集名称是什么? - sonne
我的解决方案名称为demo,其中包含7个项目。其中之一是MyTraceLogger,它具有MyTextTraceListener。另一个项目引用了MyTranceLogger并使用TraceSource。当我右键单击MyTraceLogger的属性时,它显示程序集为MyTraceLogger,我的命名空间也是MyTraceLogger。我应该更改命名空间吗?我不知道为什么程序集和命名空间都相同,我从未注意到它。 - Hieu N Trinh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接