在程序中途更改企业库配置

时间:2014-11-11 17:03:12

标签: c# enterprise-library enterprise-library-5

我想在一段时间内登录到一组特定的文件/文件夹,然后切换并开始记录到另一组文件。为此,我使用流畅的API来设置我想要的文件名(此处未显示)。但是我无法在程序中途更改配置。它没有像我预期的那样工作。如果我第二次设置配置,是否有任何重新加载或清除我需要执行的配置的命令?

如果我发表评论FirstConfig();和下一个Log声明,那么SecondConfig()工作正常。否则,只有FirstConfig()似乎有效。

static void Main(string[] args)
{

    FirstConfig();
    Logger.LogInfoMessage("Before processing"); //Some wrapper around EntLib logger methods

    //Do some processing for some time

    SecondConfig();
    Logger.LogInfoMessage("After after processing");
}

private static void FirstConfig()
{
    var textFormatter = new FormatterBuilder()
        .TextFormatterNamed("First Text Formatter")
        .UsingTemplate("{message}");

    var builder = new ConfigurationSourceBuilder();
    builder.ConfigureLogging()
        .WithOptions.DoNotRevertImpersonation()
        .LogToCategoryNamed("General").WithOptions.SetAsDefaultCategory()
        .SendTo.FlatFile("First Listener")
        .FormatWith(textFormatter).WithHeader("").WithFooter("")
        .ToFile("Logs\\BeforeChange.log");

    var configSource = new DictionaryConfigurationSource();
    builder.UpdateConfigurationWithReplace(configSource);
    EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
}

private static void SecondConfig()
{
    var textFormatter = new FormatterBuilder()
        .TextFormatterNamed("Second Text Formatter")
        .UsingTemplate("{message}");

    var builder = new ConfigurationSourceBuilder();
    builder.ConfigureLogging()
        .WithOptions.DoNotRevertImpersonation()
        .LogToCategoryNamed("General").WithOptions.SetAsDefaultCategory()
        .SendTo.FlatFile("Second Listener")
        .FormatWith(textFormatter).WithHeader("").WithFooter("")
        .ToFile("Logs\\AfterChange.log");

    var configSource = new DictionaryConfigurationSource();
    builder.UpdateConfigurationWithReplace(configSource);
    EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
}

1 个答案:

答案 0 :(得分:1)

最后一行是创建一个新容器并为其分配配置,您将创建两个不同的容器。

我认为企业库允许在不重启应用程序的情况下检测现有日志记录配置更改。您可能只想修改现有配置,然后处理更改。

http://msdn.microsoft.com/en-us/library/ff664363%28PandP.50%29.aspx

所有配置源类都实现IConfigurationSource接口。此接口允许您的应用程序代码订阅配置更改的通知。有关更多信息,请参阅Updating Configuration Settings at Run Time。默认情况下,在Enterprise Library中,只有“记录应用程序块”注册才能接收配置更改的通知。

对于Enterprise Library 5.0 http://msdn.microsoft.com/en-us/library/ff664640%28v=pandp.50%29.aspx

"一个例外是Logging Application Block,它能够检测配置更改并重新加载配置而无需重新启动应用程序。这适用于Web窗体和Windows窗体应用程序,但它仍会自动触发应用程序重新启动Web窗体应用程序。这意味着在更改配置文件时,不能依赖ASP.NET应用程序中的进程内会话状态维护。 "

您可以通过注册IConfigurationSource接口中定义并由所有Enterprise Library配置源实现的SourceChanged事件来检测配置更改。您可以使用标准事件处理方法注册和取消注册此事件,如以下示例所示,该示例检测存储在名为MyConfig.config的自定义文件中的配置更改。