【问题标题】:Configuring custom TextWriterTraceListener to web.config将自定义 TextWriterTraceListener 配置为 web.config
【发布时间】:2015-02-16 12:55:32
【问题描述】:

我看到了有关此主题的两个答案,但我无法弄清楚。我有一个自定义 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 现在出现错误无法创建 MyTraceLogger.MyTextTraceListener、MyTraceLogger、Version=1.0.0.0、Culture=中性,PublicKeyToken=null 另一个帖子说重载了一个构造函数。我不知道要重载哪一个,所以我试试这个: public MyTextTraceListener() : base() { } 它仍然说无法创建。
  • 我尝试公开 MyTextTraceListener(string name) : base(name) { } 并对其进行调试,我看到它传入的字符串是我的日志名称,但似乎这个构造函数被称为2 或 3 次,然后我得到 stackoverflow 错误。
  • 我偶然发现了这篇文章。 nicholas.piasecki.name/blog/2009/03/…

标签: c# asp.net system.diagnostics


【解决方案1】:

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

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

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

也参考这篇文章:How to define custom TraceListener in app.config

【讨论】:

  • 我想控制在特定时间我想要什么类型或日志,例如错误或警告或信息日志。
  • 仔细看看我的答案,它的作用与 config 完全一样,只是以一种更简单、更可控的方式。您将使用声明实例方法获得相同的行为。
  • 我没有尝试过这种方式,但是如果我想更改日志名称怎么办,我可能可以使用 appsetting 添加键。如果可能的话,我仍然想使用配置方式来学习。
  • 实现一个字符串参数,您可以根据需要更改该参数以生成日志文件名。
【解决方案2】:

为什么要把命名空间放两次?我想你只需要:

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

【讨论】:

  • 我以为你需要其中的程序集名称和命名空间名称。无论如何我已经尝试过你建议的那个,同样的错误。
  • 您可以获得正确的字符串以用于 typeof(MyTraceLogger).AssemblyQualifiedName
  • 结果是这样的: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 同样的错误
  • 你的应用程序名称,程序集名称是什么?
  • 我的解决方案名称演示,其中有 7 个项目。其中之一是具有 MyTextTraceListener 的 MyTraceLogger。另一个项目引用 MyTranceLogger 并使用 TraceSource。当我右键单击 MyTraceLogger 的属性项目时,它显示程序集是 MyTraceLogger,我的命名空间也是 MyTraceLogger。我应该更改命名空间吗?我不知道为什么程序集和命名空间都一样,我从来没有注意到。
猜你喜欢
  • 2012-08-04
  • 2011-06-17
  • 1970-01-01
  • 2013-06-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多