2009-11-20 60 views
1

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

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

有什么建议吗?

回答

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("[email protected]", "[email protected]", "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的一个条目

+0

完美的,正是我所期待的。谢谢 – 2009-11-20 20:10:07

+0

因此,添加监听器只会在运行时添加它们,对吧?对于ASP.NET Web应用程序,它是否适用于每个用户会话的整个持续时间? – 2013-12-17 15:59:08

0

要切换过滤器可以使用日志写/记录器类的用getFilter方法检索过滤器,然后对其进行处理。例如我们在我们的配置中有一个Logging Enabled Filter。我们可以切换此:

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

希望这会有所帮助。

+0

试过这个,但是'Logger.isLoggingEnabled()'总是返回初始加载的值 – Legends 2016-09-16 18:43:14