log4net:ERROR 使用空 'element' 参数调用 ConfigureFromXml

log4net:ERROR ConfigureFromXml called with null 'element' parameter

我们使用 .NET Core 的 log4net 库将日志写入文件。但是我们在执行应用程序 "log4net:ERROR ConfigureFromXml called with null 'element' parameter" 时收到此错误。 这是我们的 Program.cs 文件:

public class Program
{
    public static void Main(string[] args)
    {
        XmlDocument log4netConfig = new XmlDocument();
        log4netConfig.Load(File.OpenRead("log4net.config"));
        var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
        log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

这是 Startup.cs 文件中的配置方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        loggerFactory.AddConsole(LogLevel.Trace);
        loggerFactory.AddLog4Net();

        app.UseIdentityServer();
    }

这里是 log4net.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>

  <!-- Log4net Logging Setup -->
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
      <file value="c:\LogFiles\Applications\IdentityServer\log.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %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>
</configuration>

将您的 log4net.config 替换为以下代码:

    <?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <file value="C:\Temp\" />
    <datePattern value="yyyy-MM-dd.'txt'"/>
    <staticLogFileName value="false"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <maxSizeRollBackups value="100"/>
    <maximumFileSize value="15MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level App  %newline %message %newline %newline"/>
    </layout>
  </appender>
  <root>
    <level value="ALL"/>
    <appender-ref ref="RollingLogFileAppender"/>
  </root>
</log4net>

事实上,接受的响应并不准确,XML 的问题在于 log4net 配置之上的 .NET 配置。原始配置文件是 .NET 配置文件而不是 log4net 配置文件,并且它以 configuration 节点而不是 log4net 节点为根。

另一方面,第二个配置 XML 是正确的,但它是在替换原来的配置(当然可能是更好的配置),不仅解决了问题,而且用新的配置替换了原来的配置一.

对更改的更好响应是:

  1. 从原始 xml 文件中删除 configuration 根节点以及 configSections 节点和将 log4net 节点保留为 XML 的根,导致:

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- Log4net Logging Setup -->
    <log4net>
      <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
        <file value="c:\LogFiles\Applications\IdentityServer\log.txt" />
        <appendToFile value="true" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %level %logger - %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>
    
  2. 如果需要,用 Rolling appender 重新配置你的 appender...