2013-02-26 80 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> 

祝你好运。