2011-08-02 89 views
3

請幫助我,我想在我的Windows服務上運行log4net。這簡直是​​ - 任務不可能。Log4net和windows服務。我該怎麼做才能做到這一點

首先,與Win表單 - 工作很好。

這是我做的Windows服務:

添加到裝配:

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

我的配置:

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

    <log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="log-file.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c: %m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    </log4net> 

我的類:

public class LogProvider 
{ 
    private ILog _Log; 


    public LogProvider(string className) 
    { 
     XmlConfigurator.Configure(); 
     _Log = LogManager.GetLogger(className); 
    } 

    public void Info(object message) 
    { 
     _Log.Info(message); 
    } 
} 

而且在主程序:

using log4net; 
using log4net.Config; 

(...) 

private LogProvider _logProvider; 

(...) 

       _logProvider = new LogProvider("Test"); 
       _logProvider.Info("asds"); 

什麼是繼續?

如果可能的話,請給我看一個示例項目 - 因爲上面的代碼大約是100個版本或更多。我開始相信,這是不可能使用Windows服務使用log4net。


UPDATE:

所以,有關權限: 其實我得到一個例外,有關權限。我解決這個問題這條線(requirePermission =「假」):現在

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

,它仍然沒有工作,沒有例外。

這是我最後的exec代碼:

protected override void OnStart(string[] args) 
{ 
    try 
    { 

     LogProvider lp = new LogProvider("asd"); 
     lp.Info("asd2"); 
    } 
    catch (Exception ex) 
    { 
     System.IO.FileInfo _file; 
     System.IO.StreamWriter _writer; 
     _file = new System.IO.FileInfo("D:\\Log\\asdCatch.txt"); 
     _writer = _file.CreateText(); 
     _writer.WriteLine("[" + DateTime.Now.ToString() + "] Init Log"); 
     _writer.WriteLine("[" + DateTime.Now.ToString() + "] " + ex.ToString()); 
     _writer.Close(); 

    } 
} 

現在我真的很困惑,我已經創造了另一個窗口服務,它的工作 - 不經許可該行。 OMG,這很奇怪。


UPDATE2: 好的,我明白了。我不知道會這樣怎麼回事,但我發現在我的app.config該行:

<runtime> 
    <NetFx40_LegacySecurityPolicy enabled="true"/> 
    </runtime> 

我工作的15子項目計劃和認真,我不知道它是從哪裏來的:/

+0

你有什麼觀察?有拋出異常嗎?或者它不會產生你期望的輸出? –

+0

它應該在開始時記錄「asds」。沒有新文件。我嘗試在C:\\我D:\\ {tmp},直接在我的目錄應用程序.. – Marshall

+0

然後沒有崩潰或異常。你有沒有考慮過使用procmon(SysInternals工具)來觀看你的Windows服務?它會告訴你任何文件系統訪問。 –

回答

6

我們有一個問題,因爲該服務運行時目錄是C:\Windows\SystemC:\Windows\System32。因此,log4net.config必須在您的系統目錄中,這是不可取的,或者您必須提供log4net.config文件的路徑。

+0

這對我來說也是一樣。我只是將log4net配置與app.config文件合併在一起。 – maulik13

4

如果此日誌記錄在Windows應用程序中工作,最有可能是權限問題。當您登錄Windows服務時,運行Windows服務的用戶必須擁有對您嘗試登錄的文件夾的寫入權限。

此外,您應該嘗試啓用log4net調試,看看這是否有助於你。

<log4net debug="true"> 

    ... configuration ... 

</log4net> 

你也應該看看我在後的答案與此非常相似,如果有其他問題:

log4net doesn't create log file when deployed on IIS7

+0

但是從勝利形式 - 工作良好。如何設置來自C#的權限? – Marshall

+0

Cole暗示Windows服務正在運行的帳戶沒有權限將文件寫入到您要登錄的任何位置。因此,如果該文件夾是C:\ MyLogs,Windows服務正在運行的用戶必須具有該文件夾的寫入權限。您將無法通過Windows服務中的C#代碼爲服務正在運行的用戶授予對文件夾的權限。如果他們在服務嘗試寫入日誌之前沒有權限,則不會記錄日誌。 – ElvisLives

+0

最佳答案!我把debug =「true」,我看到我的配置有什麼問題。 – neustart47

2

我已經成功使用log4net + windows服務,您可以啓用log4net內部調試(http://log4net.sourceforge.net/release/1.2.0.30316/doc/manual/faq.html#internalDebug)和在控制檯模式下運行的服務,查看任何是否有誤

試試這個還有:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config", Watch = true)] 
相關問題