2

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

尝试获取 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);

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

有什么建议么?

4

2 回答 2

1

What do you actually DO with the configuration once you're done with it? Have you put it into a configuration source and fed it to a container or to Entlib?

Your configuration looks ok at first glance, but that just builds the object graph. You need something like this afterwards:

  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)

That should do it. If it doesn't, please post a more detailed example and I can probably debug it for you.

UPDATE

The following example works just fine for me, I just tried it:

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

The only different I can see is I'm using a TextFormatter instead of whatever your StandardFormatter is. Try this and see if it works - if not, then there's something else missing.

于 2010-08-29T22:32:37.813 回答
0

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

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

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

或者:

EnterpriseLibraryContainer.Current
    = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

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

于 2010-07-08T15:57:49.273 回答