我可以在运行时更改企业库日志记录块的配置吗?

时间:2009-03-08 22:23:34

标签: logging configuration-files enterprise-library

在没有讨论EntLib日志块的优点或其他内容的情况下,有什么方法可以在运行时更改它的配置?

例如,我将块配置为将常规事件记录到平面文件,将重要事件记录到事件日志中 有没有办法更改它以将常规事件记录到控制台等,而无需重新启动我的应用程序?

澄清:我正在编写一个长期运行的服务器应用程序。我希望能够临时增加各种日志记录组的详细程度/输出以进行诊断/故障排除,而无需重新启动应用程序。重新启动不是一种选择,因为它意味着生产中的“站点停机”。

2 个答案:

答案 0 :(得分:5)

实际上很容易实现,只需按照以下步骤操作:

将Enterprise Library配置放在单独的文件中

<configuration>
  <configSections>
    <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <enterpriseLibrary.ConfigurationSource selectedSource="EntLib Config">
    <sources>
      <add name="EntLig Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          filePath="EntLib.config" />
    </sources>
  </enterpriseLibrary.ConfigurationSource>
</configuration>

添加日志记录过滤器。您可以使用日志条目优先级或类别来过滤日志条目,因此在代码中应相应地设置优先级或类别。例如,您希望提供非常重要的消息和低优先级的数字,例如1,更详细的消息可能是10。

<configuration>
  ...
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    ...
    <logFilters>
      <add minimumPriority="1" maximumPriority="10" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="Priority Filter" />
    ...
  </loggingConfiguration>
</configuration>

忽略对运行时企业库配置所做的任何更改 - 除了对日志记录应用程序块进行的更改。在MSDN上查看此帖子:Updating Configuration Settings at Run-time

我实现了一个简单的帮助方法来切换过滤器值:当我想要更详细的消息时,我允许通过增加最大优先级值来注册这些条目。同样,当我只想记录异常或其他非常重要的消息时,我将优先级范围设置为0到1.

var path = System.IO.Path.Combine(Environment.CurrentDirectory, "EntLib.config");
var xd = XDocument.Load(path);

var x = (from z in xd.Root.Elements("loggingConfiguration").Elements("logFilters").Elements() where (z.Attribute("name").Value == "Priority Filter") select z).SingleOrDefault();
x.Attribute("minimumPriority").Value = 1; // Change this value...
x.Attribute("maximumPriority").Value = 5; // ... and this one to specify the range you want to log.

xd.Save(path);

这将更改企业库日志记录功能,而无需重新加载您的服务,因为永远不会触及web.config。唯一的缺点是需要使用soem类型的日志条目优先级/分类约定。

答案 1 :(得分:1)

我知道您可以打开ConfigurationFileMap并更改记录器的配置。但是,我不确定这是否会以您希望的方式解决问题,因为保存配置文件会重置应用程序,您必须将其重置为默认值。简单地连接控制台需要做很多工作。

由于日志记录块使用提供者模型,您应该能够在运行时附加到它,但我不知道如何执行此操作。但是,您拥有EntLib的完整源代码,因此运行代码堆栈来解决这个问题不应该是一件大事。你甚至不需要通过代码反思来破解它。

我认为您的目标是实时观看应用程序?