2013-06-21 55 views
1

如何使用NLog從windows服務中的動態加載的dll寫入NLog。如何使用Nlog從動態加載的dll在windows服務中寫入eventLog

使用NLog 2.0.1 我有一個Windows服務,動態加載一個DLL,從我正在使用(嘗試)NLog日誌記錄到事件日誌。 eventLog是自定義的,由服務安裝程序創建。

錯誤:

Service cannot be started. System.Reflection.TargetInvocationException: 
Exception has been thrown  by the target of an invocation. 
---> System.TypeInitializationException: The type initializer for 'MyService.Worker' threw an exception. 
---> NLog.NLogConfigurationException: Error during initialization of EventLog Target[eventLog_wrapped] 
---> System.IO.IOException: The network path was not found. 

     at Microsoft.Win32.RegistryKey.Win32ErrorStatic(Int32 errorCode, String str) 
     at Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(RegistryHive hKey, String machineName, RegistryView view) 
     at System.Diagnostics.EventLog.GetEventLogRegKey(String machine, Boolean writable) 
     at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly, Boolean wantToCreate) 
     at System.Diagnostics.EventLog._InternalLogNameFromSourceName(String source, String machineName) 
     at System.Diagnostics.EventLog.LogNameFromSourceName(String source, String machineName) 
     at NLog.Targets.EventLogTarg... 

我創建了一個winform應用程序來測試記錄和日誌記錄正常工作,但是當我嘗試做同樣的事情在我的服務這是行不通的。

我試着運行「本地系統」和「網絡服務」下的服務,我得到了同樣的錯誤。至於「網絡路徑....」沒有網絡路徑被訪問,所以我不知道這是什麼試圖告訴我。

我NLOG配置/目標是:

<variable name="appName" value="MyApp" /> 
<variable name="source" value="MySource" /> 

    <target xsi:type="EventLog" 
     name="log" 
     log="My Service" 
     source="${source}" 
     machineName="." 
     layout="${callsite}${newline} ${message}${newline}${exception:format=ToString}" 
      /> 

如何得到這個工作任何想法,將不勝感激。

回答

1

好吧,令人尷尬,但也許會爲他節省一些時間。

簡而言之,nlog.config文件位於錯誤的目錄中。

解決方案有兩個項目,服務主機/安裝程序項目和邏輯/工作完成的項目。服務從服務主機/安裝程序的調試文件夾安裝(仍在早期測試中)。邏輯dll是由服務hsot從邏輯項目調試文件夾加載的。邏輯文件夾包含nlog.config。因此,當服務啓動時,無法在運行服務主機的位置找到nlog.config文件。

服務主機沒有引用service.dll,不是一個問題,因爲dll在運行時加載,但nlog.config文件是一個問題。

創建服務的簡單解決方案是將邏輯/工作項目輸出更改爲與服務主機輸出目錄相同。

0

當嘗試創建EventLog時,我有一個System.TypeInitializationException,並且如果源不存在,則設置MaximumKilobytes。

通過在創建EventLog對象之前移動EventLog.CreateEventSource()來解決。

if (!EventLog.SourceExists(SOURCE)) { 
EventLog.CreateEventSource(SOURCE, LOG); 
} 
eventLog = new EventLog(); 
eventLog.Source = SOURCE; 
eventLog.Log = LOG; 
eventLog.MachineName = System.Environment.MachineName; 
eventLog.MaximumKilobytes = 1024;