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 に答える