2013-12-18 25 views
1

我試圖使用Topshelf.Log4Net和log4net配置基於Topshelf的Windows服務以記錄到自定義事件日誌。如果我在命令行模式下運行應用程序,這工作正常。當我嘗試安裝與BillsTestService.exe install的服務,我得到:由於事件源已存在,服務安裝失敗

INFO Topshelf v3.1.107.0, .NET Framework v4.0.30319.18052 
DEBUG Attempting to install 'BillsTestService' 
Running a transacted installation. 
... 
Service BillsTestService has been successfully installed. 
Creating EventLog source BillsTestService in log Application... 

An exception occurred during the Install phase. 
System.ArgumentException: Source BillsTestService already exists on the local computer. 
... 
    at System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) 

我在LINQPad安裝前試圖運行EventLog.DeleteEventSource("BillsTestService");;成功,但後續服務安裝仍然失敗。

我log4net的Appender的配置是:

<appender name="ErrorEventLogAppender" type="log4net.Appender.EventLogAppender" > 
    <threshold value="ERROR" /> 
    <logName value="MyCompanyServices" /> 
    <applicationName value="BillsTestService" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%-5level %logger - %message%newline" /> 
    </layout> 
</appender> 

我在做什麼錯?

意圖是將多個服務日誌錯誤記錄到相同的日誌名稱(使用不同的應用程序名稱);日誌將由操作創建。

+0

不檢查它是否已經存在嗎? –

+0

@TonyHopkinson我沒有編寫任何代碼來創建EventLog源代碼。這些都在Topshelf和/或log4net庫中。 – TrueWill

+1

看到這個主題:https://groups.google.com/forum/#!topic/topshelf-discuss/-4xfRS0uz-8 –

回答

5

問題的一部分是,Topshelf在安裝時會自動創建以該服務命名的eventlog源。由於log4net appender applicationName也用作事件日誌源,因此不能爲爲實際的應用程序/服務名稱。源在本地計算機上必須是唯一的。我在log4net配置中爲該名稱添加了「源」後綴。

另一部分是服務沒有創建日誌的權限。它可以創建一個新的源,但不能創建一個新的日誌。要做到這一點的方法之一是在代碼(我用LINQPad):

EventLog.CreateEventSource("FOODEBUG", "MyCoSvc"); 

EventLog mylog = new EventLog("MyCoSvc"); 
mylog.Source = "FOODEBUG"; 

mylog.WriteEntry("This is a test."); 

EventLog.DeleteEventSource("FOODEBUG"); 

我不是正面的,如果你確實有寫入日誌創建它;花了兩天以上後,我寧願安全。

另請注意,日誌名稱限制爲8個字符;您可以延長時間,但系統僅將前8個字符視爲重要。

根據Chris Patterson的建議,不需要移動log4net初始化。簡單包括

configurator.DependsOnEventLog(); 
configurator.UseLog4Net("MyService.exe.config"); 

HostFactory.Run代表是足夠的。 (我正在使用Topshelf.Log4Net。)

最後,我確信整個Windows事件日誌記錄系統是片狀的。事件查看器的刷新不適用於所有情況,一次我的應用程序日誌條目消失,我相信在重新啓動後我看到了不同的結果。

+1

非常棒! 'ServiceInstaller.ServiceName'!='EventLog.LogName' – SliverNinja

0

將您的log4net初始化移動到服務的ConstructUsing()配置委託,而不是指定在安裝/卸載過程中使用,而不需要實例化服務類。

或者,只有在實際服務運行時使用事件日誌appender,方法是在配置文件外部添加appender,或者修改配置以消除事件日誌appender,除非發生ERROR或FATAL事件。

我的猜測是DEBUG/INFO級別的事件正在嘗試登錄到appender,並且源文件尚不存在。

+0

我已經嘗試在ConstructUsing中的代碼中配置log4net - 它不起作用(如果作爲服務運行)。顯然,Topshelf默認創建一個以日誌應用程序中的服務命名的EventLog源。我試圖改變我的來源的名字;沒有幫助。我正在嘗試使用Topshelf.Log4Net;我認爲記錄到事件日誌的服務將是一種常見的情況。 – TrueWill

+0

我嘗試在BeforeStartingService中配置log4net(再次使用不同的ApplicationName) - 它在控制檯模式下工作正常,並且在服務模式下不執行任何操作。 – TrueWill

相關問題