2013-02-26 58 views
11

以下配置沒有任何反應。log4net與EventLogAppender不記錄

的App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <log4net> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    </log4net> 
</configuration> 

Form1.cs中(例)

public partial class Form1 : Form 
{ 
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    public Form1() 
    { 
     InitializeComponent(); 

     log.Fatal("Test!"); 
    } 
} 
+0

什麼版本的工作室? – 2013-02-26 11:47:30

+0

Visual Studio 2012 + Windows 8. – timmkrause 2013-02-26 11:49:47

回答

13

你缺少的根配置,所以你需要像

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> 
    </startup> 
    <log4net debug="true"> 
     <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
     <applicationName value="MyApp" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
     </appender> 


     <root> 
     <level value="All" /> 
     <appender-ref ref="EventLogAppender" /> 
     </root> 


    </log4net> 
</configuration> 

還要注意的是,如果你的程序被稱爲APP.EXE,那麼你就需要所謂的APP.EXE事件日誌源。如果這不存在,那麼Log4net將嘗試創建它,但這需要管理員權限,因此您可能需要至少一次以管理員身份運行程序以創建此事件源。爲了避免這種情況,事件源通常會作爲已經以admin身份運行的安裝過程的一部分創建。

+0

與同行的代碼行結合起來,它終於奏效了。謝謝! :)還有最後一個缺陷:只有當我啓動.exe文件時纔會顯示日誌條目,但是當我點擊f5時不會顯示。對最後一個有任何想法? – timmkrause 2013-02-27 08:55:47

+0

在Visual Studio輸出窗口中是否有任何錯誤消息?上述配置的debug =「true」部分應該提供有關log4net正在執行的信息,並且如果失敗,應該包含錯誤消息。 (您可能想在您的日誌記錄工作時禁用調試模式) – sgmoore 2013-02-27 09:25:02

+0

「log4net:ERROR [EventLogAppender] ErrorCode:GenericFailure。捕獲SecurityException嘗試訪問EventLog。很可能事件源Log4NetEventViewer.vshost.exe不存在並且必須由本地管理員創建。「 - 我以管理員身份啓動.exe來創建事件源,但不是VS或vshost版本。以管理員身份運行.vshost.exe還不夠,因爲它以「-clr2」後綴或其他方式啓動了.exe。以管理員身份運行VS曾解決它。謝謝! – timmkrause 2013-02-27 10:43:09

5

您應該添加:

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

在你的項目的AssemblyInfo.cs 。這將初始化記錄器。並把log4net放到一個名爲log4net.config的文件中。

+0

我試過了,然後再次刪除它,因爲它沒有任何作用。 – timmkrause 2013-02-26 12:13:17

+0

對不起,你是對的。在我添加由sgmoore提供的元素之後,它仍然無法工作,但是在AssemblyInfo.cs中添加了該行後,它可以正常工作。 – timmkrause 2013-02-27 08:52:09

0

確保你給寫權限的用戶:

HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \服務\事件日誌\ MyApp的

,如果你想添加更多logers必須遵循這種命名:

<root name="EventLog"> 
<level value="ALL"/> 
<appender-ref ref="FirstLog"/> 
</root> 

<logger name="FileLogger" additivity="false"> 
<level value="ALL" /> 
<appender-ref ref="Secong_Log" /> 
</logger> 

祝你好運。