为什么log4net在配置文件中无法识别?

24

我用C#编写了一个测试控制台应用程序,使用log4net

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using log4net;
using log4net.Config;

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

namespace Log4Net_Test
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {    
            log.Info("Entering application");    
            log.Debug("Debug message");    
            log.Info("Leaving application");
        }
    }
}

我的 App.config 文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>
  <log4net>
    <!-- A1 is set to be a ConsoleAppender -->
    <appender name="A1" type="log4net.Appender.FileAppender">
      <file value="logfile.txt" />
      <appendToFile value="false" />

      <!-- A1 uses PatternLayout -->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
      </layout>
    </appender>

    <!-- Set root logger level to DEBUG and its only appender to A1 -->
    <root>
      <level value="DEBUG" />
      <appender-ref ref="A1" />
    </root>
  </log4net>
</configuration>

执行测试程序会得到以下错误消息:

log4net:ERROR Exception while reading ConfigurationSettings. Check your .config
file is well formed XML.
System.Configuration.ConfigurationErrorsException: Configuration system failed t
o initialize ---> System.Configuration.ConfigurationErrorsException: Unrecognize
d configuration section log4net. 

我的配置文件有什么问题?
更新1: 正如被接受的答案所指出的那样,configSections部分缺失。但是我还必须删除startup部分,否则会出现相同的错误。我不知道为什么startup部分也会导致问题。也许更有经验的人可以解释并留下评论。
3个回答

35

您需要在

块中也添加log4net

<configSections>

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

</configSections>

谢谢,这部分内容确实缺失了。 - John Threepwood

13

6
只要 log4net 的 configSection 在 4.5 启动块之前,我的程序就能正常运行。 - nathanchere
2
我可以确认@nathanchere建议的修复。 - tyh
3
这是不正确的。Log4Net肯定支持.NET 4.5。 - sean717
log4net的当前版本使用上述解决方案可以正确地与.NET 4.5配合使用。 - Gianpiero
1
即使上述启动也没有解决我的问题。它必须是配置的第一个子元素。在4.5中似乎可以正常工作。 - Jason Eades

4
你还应该记得,<configSections>区块必须放在<configuration>之下,否则会出现错误:

读取ConfigurationSettings时发生异常。请检查您的.config文件是否为良好格式的XML。

例如:

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>   
  <!-- Log4net Logging Setup -->   
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
      <file value="service.log" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!--
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
      -->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date [%thread] %-5level %logger.%method - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="FileAppender" />
    </root>   
  </log4net>   
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>

3
哇!这帮了我很多!但还有更多:configSections节点必须是configuration节点下的第一个节点,否则就会收到你提到的那个错误信息。 - Igor
这也帮助了我。配置部分是第一个节点。 - Gauravsa
太好了,这也帮助了我。 - Zafar
这条评论让我思考了一下 - 我一直有一个单独的文件用于log4net.config - 看到启动在底部 - 让我将log4net部分移到app.config中(我已经添加了一个配置部分),移动了log4net部分后 - 它终于开始工作了(.Net 4.6.1项目目标) - 不确定发生了什么变化 - 但现在它可以记录日志,并且在加载时不会抛出异常。 - Mark W. Mitchell

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