让log4net使用应用配置文件进行配置数据

53
我希望能够在我的application.config文件中存储log4net配置数据。根据我对文档的理解,我按照以下步骤进行操作:
  1. 添加对log4net.dll的引用

  2. 在AssemblyInfo.cs中添加以下行:

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
  3. 按以下方式初始化记录器:

    private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
    
  4. 我在我的app.config中有如下代码:

  5.     <configSections>
          <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
        </configSections>
        <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>
          <root>
            <level value="INFO" />
            <appender-ref ref="ConsoleAppender" />
          </root>
        </log4net>
    

    然而,当我运行该应用程序时,在控制台上出现以下错误信息:

    找不到名为[Consoleappender]的appender。

    我该如何让log4net从配置文件中读取设置?

    谢谢!


你的 app.config 文件中有什么代码? - sgwill
4
注意:所展示的app.config设置似乎是正确的,除了<appender>部分中的EventLogAppender<root><appender-ref>部分中的ConsoleAppender名称不匹配。请参阅@Konstantin的答案。此外,对于那些不熟悉log4net并使用此问题学习如何使用它的人们,注意你可能需要一个不同类型的appender - 例如 type="log4net.Appender.FileAppender,log4net"(将日志追加到文件,而不是Windows事件日志)。 - Dan Nissenbaum
5个回答

40
在configSections元素中,添加一行到你的app.config配置文件中。
<configSections>
 <section name="log4net" 
   type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, 
         Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>

然后稍后添加log4Net部分,但将其委托给其他地方的实际log4Net配置文件...

<log4net configSource="Config\Log4Net.config" />

在你的应用程序代码中,当你创建日志时,请写入:

private static ILog GetLog(string logName)
{
    ILog log = LogManager.GetLogger(logName);
    return log;
}

顺便提一下,我也缺少 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)],特别是 **ConfigFile = "Log4Net.config"**。 - Matt Canty

37

根据问题所显示的配置,只有一个名为“EventLogAppender”的附加程序被配置。但在root的配置中,作者引用了一个名为“ConsoleAppender”的附加程序,因此导致错误消息。


1
这应该是被接受的答案,因为OP想要将他的应用程序的log4net.configapp.config文件合并成一个文件。 - RBT

5
我完全支持@Charles Bretana的回答。但是如果它不起作用,请确保只有一个<section>元素,并且configSections是根元素的第一个子元素
在配置后,configsections必须是您的app.Config中的第一个元素:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
  </configSections>
  <!-- add log 4 net config !-->
  <!-- add others e.g. <startup> !-->
</configuration>

这是关键:是根元素的第一个子元素 - CJBS

3
你是否尝试过在你的app.config文件中添加一个configsection处理程序?例如:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

2
所有的appender名称必须在根(root)部分中详细说明。在您的情况下,appender名称为EventLogAppender,但在<root><appender-ref..部分中命名为ConsoleAppender。它们需要匹配。
您可以向日志配置中添加多个appenders,但是您需要在<root>部分中注册每个appender。
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="EventLogAppender" />

您还可以参考Apache关于配置log4net的文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接