在安裝.Net Windows服務期間,我無法可靠地創建/刪除事件源。在安裝.Net服務期間創建自定義事件日誌和事件源的最可靠方法是什麼
這裏是我的ProjectInstaller類的代碼:
// Create Process Installer
ServiceProcessInstaller spi = new ServiceProcessInstaller();
spi.Account = ServiceAccount.LocalSystem;
// Create Service
ServiceInstaller si = new ServiceInstaller();
si.ServiceName = Facade.GetServiceName();
si.Description = "Processes ...";
si.DisplayName = "Auto Checkout";
si.StartType = ServiceStartMode.Automatic;
// Remove Event Source if already there
if (EventLog.SourceExists("AutoCheckout"))
EventLog.DeleteEventSource("AutoCheckout");
// Create Event Source and Event Log
EventLogInstaller log = new EventLogInstaller();
log.Source = "AutoCheckout";
log.Log = "AutoCheckoutLog";
Installers.AddRange(new Installer[] { spi, si, log });
引用只返回字符串的日誌,服務的名稱門面方法等
此代碼工作的大部分時間,但最近安裝後,我開始讓我的日誌條目顯示在應用程序日誌中,而不是自定義日誌中。並且以下錯誤也出現在日誌中:
無法找到源(AutoCheckout)中事件ID(0)的說明。本地計算機可能沒有必要的註冊表信息或消息DLL文件來顯示來自遠程計算機的消息。您可以使用/ AUXSOURCE =標誌來檢索此說明;詳細信息請參閱幫助和支持。
由於某種原因,它不是在卸載過程中沒有正確刪除源代碼,或者在安裝過程中沒有創建它。
任何有關這裏的最佳做法的幫助表示讚賞。
謝謝!
另外,這裏是我如何寫例外日誌的一個示例:
// Write to Log
EventLog.WriteEntry(Facade.GetEventLogSource(), errorDetails, EventLogEntryType.Error, 99);
關於stephbu的回答是:推薦路徑是安裝腳本和installutil,或Windows安裝程序例程。
我正在使用安裝項目,它執行服務的安裝並設置日誌。無論我使用installutil.exe還是Windows安裝項目,我都相信他們都會調用上面顯示的同一個ProjectInstaller類。
我看到如果日誌在重新啓動之前沒有真正刪除,我的測試機器的狀態會如何導致錯誤。我會試驗更多,看看是否解決了這個問題。
編輯: 我感興趣的是在安裝服務期間註冊源和日誌名稱的確定的方法。因此,如果該服務先前已安裝,則會在隨後的安裝過程中刪除源代碼或重新使用源代碼。
我還沒有機會學習WiX來嘗試這條路線。
供參考:我仍然在尋找一個可靠的解決方案來解決這個問題。 – 2008-09-23 17:29:37
Jason, 而不是刪除EventLogSource(如果存在)爲什麼不僅在日誌源和日誌不存在時執行安裝? 我還沒有嘗試過,因爲我發現你的問題是爲了迴應我自己的搜索。我有一個簡單的服務,我正在安裝一個單獨的服務安裝項目。 最好, 傑森 – Tinidian 2009-12-28 08:17:09