2010-06-29 192 views
7

我有一個控制檯應用程序,我正在轉換成一個Windows服務。作爲控制檯應用程序,我的log4net日誌記錄工作正常。但將其轉換爲Windows服務,我的log4net日誌已停止工作。log4net不能在Windows服務工作

我已經加入這個我在服務項目的AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

這是藉助onStart和我的onStop服務類:

private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     private Builder _builder; 

     public YCSWebServerService() 
     { 
      InitializeComponent(); 
      _builder = new Builder(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      _log.Info("YCSWebServerService started"); 
      _builder.Start(); 
     } 

     protected override void OnStop() 
     { 
      _log.Info("YCSWebServerService stopped"); 
      _builder.Stop(); 
     } 

我有一個 「特殊」 的log4net配置文件添加到我的服務項目:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 

    <log4net> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <threshold value="DEBUG" /> 
     <applicationName value="Lantic YCS WebServer" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="(%-5level %date{hh}:%date{mm}:%date{ss} [%thread] %logger [%property{NDC}]) %message %n" /> 
     </layout> 
    </appender> 
    </log4net> 

</configuration> 

任何想法或提示?

+0

我解決了這個問題通過重寫appender。檢查此問題: http://stackoverflow.com/questions/1922430/how-do-you-make-log4net-output-to-current-working-directory/1922805#1922805 – RClemens 2013-05-10 23:50:29

回答

1

有些事情要嘗試:

運行該服務的用戶是否具有寫權限?

是否有任何異常記錄到Windows日誌?

您是否嘗試過在調試模式下運行服務以查看Log4net是否爲 引發異常?

+0

EventLogAppender不會拋出異常,因爲log4net有一個自己的錯誤處理程序,默認情況下,這個錯誤處理程序在第一次發生時將異常寫入Console.Error.WriteLine和Trace.WriteLine,所有進一步的發生都會被忽略,你可以使用自己的錯誤處理程序這篇文章的底部:http://blogs.myfirstsharepoint.de/archive/2009/06/02/aus-der-praxis-%E2%80%93-securityexception-beim-loggen-mit-eventlogappender-von-log4net。如px(文章是德文,但不會損害代碼,對吧?) – Hinek 2010-06-29 09:58:21

1

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=293617

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/5bef59bc-a28f-4e6d-8ddb-730e12764162

在Windows Vista中,Windows XP SP 2,Windows Server 2003中,2008和Windows 7用戶需要訪問安全日誌管理員權限。現在,當log4net試圖創建一個事件日誌,所有的日誌檢查,如果它已經存在。 因此,對於Windows服務,Windows服務器的用戶需要管理員權限(這不是很好)。

解決方案:配置log4net的配置一個明確的來源(像你一樣:<applicationName value="Lantic YCS WebServer" />, LANTIC YCS Web服務器是您的源),並創建該來源您在安裝(因爲安裝程序,用戶應該有管理員權限)。

+0

我的用戶帳戶具有管理權限,並且沒有任何結果。 我一直無法通過在我的配置中定義顯式源代碼來弄清楚你的意思是什麼?你能發佈一個鏈接或例子嗎? – lmkk 2010-06-29 11:20:24

+0

而且我沒有從你發佈的鏈接中獲得任何東西 – lmkk 2010-06-29 11:34:03

+0

對不起,有時我寫得有點複雜。你已經配置了一個顯式的Source: ...我編輯了我的問題... – Hinek 2010-06-29 11:34:18

6

你剛剛添加一個log4net節到你的app.config文件?在你提到的問題中你提到你有「特定的log4net配置文件」,但你給的樣本看起來像app.config的全部內容。 如果是的app.config的情況下,那麼你可以在AssemblyInfo.cs中簡單的字符串:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

還加入requirePermission =「假」在我的app.config的部分幫助我,當我固定的類似問題,log4net的沒有記錄到文件的Windows服務(請參閱附加屬性 - requirePermission =「假」):

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/> 
    </configSections> 
+0

爲我工作。我總是忘記組裝部分。 – 2014-06-19 07:29:20

0

好這個問題被問很長一段時間回來,我有可能會有一定的幫助,任何人尋找一個建議解決這個問題。如果您要將控制檯應用程序轉換爲Windows服務...您必須創建安裝程序來安裝該應用程序。當您安裝應用程序時,它通常會在ProgramFile下創建一個服務的安裝文件夾.....(當您安裝服務時檢查它,它爲您提供安裝目錄的路徑)。如果在你的web.config文件中,你已經提供了日誌文件的路徑爲「Log \ Log」。txt「,那麼你的日誌文件(Log.txt)會在安裝文件夾中有一個文件夾(Log),如果你正在尋找應用程序文件夾中的日誌文件,那麼你就是在浪費你的時間。

相關問題