2

NServiceBusをCommon.Loggingと組み合わせて使用​​する方法を理解しようとしています。私はそれを実行させることができません。私は教育目的のためだけに小さなデモアプリケーションを開発しようとしています。

私がしたことは:

1)単純なコンソールアプリケーションを作成し、Common.LoggingとCommon、Logging.NLogをインポートし、いくつかの情報メッセージを追加し、App.Configファイルを追加しました。

<configuration>
  <configSections>
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
    </sectionGroup>
  </configSections>
  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
        <arg key="level" value="DEBUG" />
        <arg key="showLogName" value="true" />
        <arg key="showDataTime" value="true" />
        <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff" />
      </factoryAdapter>
    </logging>
  </common>
</configuration>

それはうまくいきました。しかし、NServiceBusを含めると:

var bus = Configure.With().DefaultBuilder()
                             .XmlSerializer()
                             .MsmqTransport()
                             .IsTransactional( true )
                             .UnicastBus()
                             .MsmqSubscriptionStorage()
                             .CreateBus()
                             .Start( () => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install() );

この例外が発生します:

System.TypeInitializationException was unhandled
  Message=The type initializer for 'NServiceBus.Configure' threw an exception.
  Source=NServiceBus.Core
  TypeName=NServiceBus.Configure
  StackTrace:
       at NServiceBus.Configure.With()
       at ConsoleApplication1.Program.Main(String[] args) in D:\Development\katas\ConsoleApplication1\ConsoleApplication1\Program.cs:line 17
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: Common.Logging.ConfigurationException
       Message=ConfigurationReader Common.Logging.Configuration.DefaultConfigurationReader returned unknown settings instance of type Common.Logging.Configuration.LogSetting
       Source=NServiceBus.Core
       StackTrace:
            at Common.Logging.Configuration.ArgUtils.Guard[T](Function`1 function, String messageFormat, Object[] args)
            at Common.Logging.Configuration.ArgUtils.Guard(Action action, String messageFormat, Object[] args)
            at Common.Logging.LogManager.BuildLoggerFactoryAdapter()
            at Common.Logging.LogManager.get_Adapter()
            at Common.Logging.LogManager.GetLogger(String name)
            at NServiceBus.Configure..cctor()
       InnerException: System.ArgumentOutOfRangeException
            Message=Type 'Common.Logging.Configuration.LogSetting, Common.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e' of parameter 'sectionResult' is not assignable to target type 'Common.Logging.Configuration.LogSetting, NServiceBus.Core, Version=3.2.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c'
Parameter name: sectionResult
Actual value was Common.Logging.Configuration.LogSetting.
            Source=NServiceBus.Core
            ParamName=sectionResult
            StackTrace:
                 at Common.Logging.Configuration.ArgUtils.AssertIsAssignable[T](String paramName, Type valType, String messageFormat, Object[] args)
                 at Common.Logging.Configuration.ArgUtils.AssertIsAssignable[T](String paramName, Type valType)
                 at Common.Logging.LogManager.<>c__DisplayClass3.<BuildLoggerFactoryAdapter>b__1()
                 at Common.Logging.Configuration.ArgUtils.<>c__DisplayClass13.<Guard>b__12()
                 at Common.Logging.Configuration.ArgUtils.Guard[T](Function`1 function, String messageFormat, Object[] args)
            InnerException: 

StackOverflowや他のグループで提案されているいくつかのことをすでに試しましたが、うまく機能させることができません。誰かがこれにアプローチする方法についていくつかのアドバイスを提供できますか?または簡単な例を提供しますか?

この設定は派手なものであってはなりませんよね?今のところ、NServiceBus部分のロギングも必要ありません。

ありがとう!

4

1 に答える 1

3

NServiceBusには独自のバージョンのCommon.Loggingがあり、Core dllに統合されて内部化され、独自のロギングを構成するために使用されます(log4netを使用)。起動すると、app.configの構成セクションを検出し、ロードしようとします。ただし、構成セクション(「ロギング」と呼ばれる)は、外部のCommon.Loggingdllを指します。

<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />

NSBがそれを次のように見せたい場所:

<section name="logging" type="Common.Logging.ConfigurationSectionHandler, NServiceBus.Core" />

このため、NSBはエラーをスローします。これは間違いなくNSBのバグです。githubプロジェクトで問題を作成することをお勧めします。

あなたのケースではおそらく最適な解決策ではありませんが、それを回避する最も簡単な方法は、app.configのloggingセクションを削除し、コードでCommon.Loggingを構成することです。または、Common.Loggingの使用を完全にスキップして、NLogを直接使用します。

この問題は、Common.Loggingが使用されなくなったNSB4.0で解消されることを付け加えておきます。

于 2012-06-20T19:50:16.190 に答える