【问题标题】:Turn off LogEnabled Filter at run time - Logging Enterprise Application Block在运行时关闭 LogEnabled 过滤器 - 记录企业应用程序块
【发布时间】:2010-05-04 18:07:20
【问题描述】:

所以故事是这样的:

我正在使用微软提供的 Logging Enterprise Application 块来记录我们应用程序中的事件。

目标是在加载时启用事件查看器日志记录,然后将其关闭。

我所做的是添加 EventLog TraceListener,它将我们所有的日志写入事件查看器。我想要做的是在应用程序加载完成后禁用它。我能做的唯一方法是添加一个 LogEnabled 过滤器,然后将其关闭。

但是,我不知道如何在运行时访问此过滤器并禁用此侦听器的日志。

如果你有想法,请分享。

谢谢

【问题讨论】:

  • 您的 TraceListener 是通过配置设置的吗?您想以编程方式禁用日志记录吗?

标签: logging enterprise-library application-blocks


【解决方案1】:

Enterprise Library 日志记录提供了很多可供处理的信息。那么,在开始更改配置之前,也许一些开箱即用的设置可以让你做你想做的事?

在我看来,您希望您的应用程序在启动期间记录一些消息,然后不再记录任何消息。我假设您明确知道何时记录完启动消息。

如果上述情况属实,我认为最简单的方法是使用 LogEntry Priority 属性。

在配置文件中设置一个优先级过滤器,最小优先级为 2:

<logFilters>
  <add minimumPriority="2" maximumPriority="2147483647" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null"
    name="Priority" />
  <add enabled="true" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.LogEnabledFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null"
    name="LogEnabled Filter" />
</logFilters>

然后在启动期间使用 2(或更高)的优先级来记录您的消息。然后当你知道你已经完成时,将优先级设置为 1。

我会更好地封装它,但代码示例如下所示:

public class MyApp
{
    public static int LogPriority = 2;
    public static readonly string MyAppCategory = "MyAppCategory";

    static void Main()
    {
        Logger.Write("Loading 1...", MyAppCategory, LogPriority);
        // ...       
        Logger.Write("Loading 2...", MyAppCategory, LogPriority);

        // Done loading so turn off logging
        LogPriority = 1;

        Logger.Write("Message not logged", MyAppCategory, LogPriority);
    }
}


现在,如果您想为应用的其余部分启用日志记录,只需将优先级过滤器从 2 降低到 1,所有内容都会被记录。

【讨论】:

  • 为什么这么复杂?如果您不能在运行时将其设置为 false,则 LogEnabledFilter 条目是什么意思:禁用日志记录?
  • 是的,您可以通过设置 LogEnabledFiter 来禁用日志记录。执行此操作的主要方法是手动编辑配置文件——这是该功能的主要目的(开发人员指南参考管理员调整此设置)。设置过滤器的其他类似方法是以编程方式修改基于文件的原始配置(本质上是对块的重新配置),或以编程方式重新配置块(例如使用流利的接口)。没有一种程序化方法是我所说的简单
  • 如果您尝试获取过滤器并禁用它,我认为如果不重新配置它不会有任何影响。因此,以下代码仍然会记录日志:var enabledFilter = logWriter.GetFilter&lt;LogEnabledFilter&gt;(); enabledFilter.Enabled = false; logWriter.Write("TEST"); 一种非 EntLib 方法只是使用 bool 属性和帮助程序类来管理自己的启用/禁用。但我认为优先方法是一种非常直接的选择。
  • 刚刚发布了一个关于这个问题的问题哈哈,好的,我将通过外部 bool 属性来解决:-)。但是你能解释为什么它不起作用吗? Logger.IsLoggingEnabled() 始终返回最初加载的值。如您在评论中所述,手动更改值不起作用。
  • 为什么LogEnabledFilter 不可更新?你不会相信的令人震惊的答案:stackoverflow.com/questions/39538868/… :)
猜你喜欢
  • 2017-01-11
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多