【问题标题】:Can I change the configuration of the Enterprise Library Logging block at runtime?我可以在运行时更改 Enterprise Library Logging 块的配置吗?
【发布时间】:2009-03-08 22:23:34
【问题描述】:

如果不讨论 EntLib 日志记录块的优点或其他方面,有什么方法可以在运行时更改它的配置?

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

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

【问题讨论】:

    标签: logging configuration-files enterprise-library


    【解决方案1】:

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

    将企业库配置放在单独的文件中

    <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 永远不会被触及。唯一的缺点是您需要使用某种约定来对日志条目进行优先级排序/分类。

    【讨论】:

    • 你说这很简单??另一个缺点是在 web 应用程序中,在 filePath 中,您必须编写完整路径,而相对路径不起作用。我简直不敢相信 entLib 是微软的产品。
    【解决方案2】:

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

    由于日志记录块使用提供程序模型,您应该能够在运行时附加到它,但我不确定如何执行此操作。但是,您拥有 EntLib 的完整源代码,因此运行代码堆栈来解决这个问题不应该是一项主要的工作。您甚至不必通过代码进行反思即可破解它。

    我假设您的目标是实时观看应用程序?

    【讨论】:

    • 更新的问题 - 我正在编写一个 24/7 服务器应用程序,并希望在不重新启动的情况下“增加”各个区域的日志记录以进行故障排除
    • 配置重写不会发生这种情况,因为它会重新启动。如果您将 SQL 用于状态服务器,这没什么大不了的,但它可能会在请求中间引起人们的注意。我会查看代码库或考虑构建一个日志记录窗口服务,您可以在此处附加。
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多