EntLib日志记录 - 在运行时添加/编辑TraceListeners

时间:2009-11-20 16:56:46

标签: c# .net logging enterprise-library

我有一个Web应用程序,我想在运行时添加或编辑Enterprise Library日志记录。我熟悉如何通过编程方式和配置文件完全配置EntLib Logging,但我想使用两者的组合。我想通过配置文件设置一些基本的TraceListeners,但是在应用程序启动时,我想根据存储在数据库中的一些其他用户设置有条件地添加一些Email TraceListeners。

我目前的解决方案是打开web.config作为Configuration对象,并手动修改web.config部分,但我想知道是否有一种方法可以以编程方式将TraceListeners添加到当前配置的LogWriter(或其中任何一个)类。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您需要创建一个EmailTraceListener,然后将其添加到您的类别的TraceSources集合中。

在此示例中,我有一个指向平面文件的基本跟踪侦听器。

  <add fileName="trace.log" header="----------------------------------------"
    footer="----------------------------------------" formatter="Text Formatter"
    listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    name="FlatFile TraceListener" />

使用以下类别来源:

   <categorySources>
      <add switchValue="All" name="General">
        <listeners>
          <add name="FlatFile TraceListener" />
        </listeners>
      </add>
    </categorySources>

然后使用代码,我可以将一个EmailTraceListener添加到TraceSources集合。

    var emailTraceListener = new EmailTraceListener("foo@bar.com", "foo@bar.com", "Food", "Bar",
                                                    "smtp.foo.bar") {Name = "EmailTraceListener"};
    LogSource logSource;
    Logger.Writer.TraceSources.TryGetValue("General", out logSource);
    logSource.Listeners.Add(emailTraceListener);


    var logEntry = new LogEntry {Message = "Test"};
    Logger.Write(logEntry);

运行此示例然后将生成一封包含LogEntry信息的电子邮件以及日志文件trace.log中的条目

答案 1 :(得分:0)

要切换过滤器,您可以使用LogWriter / Logger类'GetFilter方法检索过滤器,然后对其进行操作。例如,我们的配置中有一个启用日志记录的过滤器。我们可以通过以下方式切换:

var filter = Logger.GetFilter<LogEnabledFilter>("<logging enabled filter name>");
filter.Enabled = true; // or false

希望这有帮助。