【问题标题】:Fluent configuration problem流畅的配置问题
【发布时间】:2010-07-07 12:59:19
【问题描述】:

我试图让流利的配置工作但没有成功。我收到以下错误:

在尝试获取 LogWriter 类型的实例时发生激活错误,键为“”

当我尝试访问记录器时:

Dim logwriter As LogWriter = EnterpriseLibraryContainer.Current.GetInstance(Of LogWriter)()

配置:

    Dim formatBuilder As New FormatterBuilder()
    Dim builder As New ConfigurationSourceBuilder()
    builder.ConfigureInstrumentation().EnableLogging()
    builder.ConfigureLogging.LogToCategoryNamed("Important") _
        .WithOptions.SetAsDefaultCategory() _
        .SendTo.RollingFile("StandardListener") _
                .RollEvery(RollInterval.Midnight) _
                .RollAfterSize(50000) _
                .WhenRollFileExists(RollFileExistsBehavior.Increment) _
        .FormatWith(formatBuilder.CustomFormatterNamed("StandardFormatter", GetType(StandardFormatter))) _
        .ToFile("D:\LogFiles\" + fileName)

更新

我已经添加了

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

我仍然无法获取日志写入器,并且 LAB 中的 Logger 也无法获取(它在内部使用 EnterpriseLibraryContainer.Current.GetInstance<LogWriter>());

有什么建议吗?

【问题讨论】:

    标签: .net logging enterprise-library fluent


    【解决方案1】:

    完成配置后,您实际上对配置做了什么?您是否将其放入配置源并将其提供给容器或 Entlib?

    您的配置乍一看还不错,但这只是构建了对象图。之后你需要这样的东西:

      dim configSource as new DictionaryConfigurationSource()
      builder.UpdateConfigurationSourceWithReplace(configSource)
      ' To use container directly
      dim container as IUnityContainer = new UnityContainer() _
        .AddExtension(New EnterpriseLibraryCoreExtension(configSource))
    
      ' Or, to use Entlib static APIs
      EnterpriseLibraryContainer.Current = EnterpriseLibrary.CreateDefaultContainer(configSource)
    

    应该这样做。如果没有,请发布一个更详细的示例,我可能会为您调试它。

    更新

    以下示例对我来说很好用,我刚刚尝试过:

    Imports Microsoft.Practices.EnterpriseLibrary.Logging
    Imports Microsoft.Practices.EnterpriseLibrary.Common.Configuration
    Imports Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners
    
    Module Module1
    
        Sub Main()
            InitializeEntlib("test.log")
    
            Logger.Write("This is a test message")
        End Sub
    
        Sub InitializeEntlib(ByVal logFileName As String)
            Dim builder As New ConfigurationSourceBuilder
            builder.ConfigureLogging() _
            .LogToCategoryNamed("Important") _
            .WithOptions.SetAsDefaultCategory() _
            .SendTo _
                .RollingFile("StandardListener") _
                    .RollEvery(RollInterval.Midnight) _
                    .RollAfterSize(50000) _
                    .WhenRollFileExists(RollFileExistsBehavior.Increment) _
                .FormatWith(New FormatterBuilder().TextFormatterNamed("Text Formatter")) _
                .ToFile("D:\LogFiles\" + logFileName)
    
            Dim configSource As New DictionaryConfigurationSource()
            builder.UpdateConfigurationWithReplace(configSource)
    
            EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource)
        End Sub
    End Module
    

    我能看到的唯一不同是我使用的是 TextFormatter 而不是您的 StandardFormatter。试试这个,看看它是否有效 - 如果没有,那么还有其他东西丢失了。

    【讨论】:

      【解决方案2】:

      我刚刚遇到了类似的错误。这是因为配置不正确。我使用了 FormatWithSharedFormatter,但没有定义共享格式化程序。

      在以下期间我没有收到任何投诉:

      var configSource = new DictionaryConfigurationSource();
      builder.UpdateConfigurationWithReplace(configSource);
      

      或:

      EnterpriseLibraryContainer.Current
          = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
      

      我得到的只是在尝试从 Unity 检索记录器时找不到记录器。删除 FormatWithSharedFormatter 配置后一切正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        相关资源
        最近更新 更多