2012-06-20 69 views
2

我想弄清楚如何結合使用NServiceBus和Common.Logging。我只是無法讓它運行。我嘗試開發一個僅用於教育目的的小型演示應用程序。NServiceBus + Common.Logging + NLog

我所做的是:

1)創建一個簡單的控制檯應用程序和進口Common.Logging和通用,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部分。

謝謝!

回答

3

NServiceBus有它自己的Common.Logging版本,它被ilmerged內部化到Core dll中,用於配置它自己的日誌記錄(使用log4net)。當它啓動時,它發現你的app.config中的配置節並嘗試加載它。然而,你的配置部分(稱爲 「記錄」)指向外部Common.Logging DLL:

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

凡NSB希望它看起來像:

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

正因爲如此,NSB拋出一個錯誤。這肯定是NSB中的一個錯誤。我建議你在他們的github項目上創建一個問題。

雖然可能不是您的最佳解決方案,但解決此問題的最快方法是刪除app.config中的日誌記錄部分並在代碼中配置Common.Logging。或者,完全跳過使用Common.Logging並直接使用NLog。

我可能會補充說,這個問題將在NSB 4.0中消失,Common.Logging不再使用。

+0

感謝您的答覆。我會永遠努力做到這一點,因爲我認爲這應該是一件容易的事情。正如你所建議的,我最終直接使用NLog。我不是很喜歡它,但現在它已經開始和NServiceBus一起愉快地拋出異常,但是現在出於完全不同的原因:) – harri