You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6下Seq.Client.log4Net需两次XmlConfigurator配置才能日志到Seq的问题

.NET 6中Seq.Client.log4Net需两次调用XmlConfigurator.ConfigureAndWatch才能发送日志的问题排查与解决

问题现象

在.NET 6环境使用Seq.Client.log4Net(3.1.0)时,出现异常行为:只有在日志方法调用前后都执行XmlConfigurator.ConfigureAndWatch,日志才能正常发送到Seq Server;但Console和File类型的日志无需第二次调用即可正常工作。

可正常发送Seq日志的代码

ILog log = LogManager.GetLogger(GetType());
XmlConfigurator.ConfigureAndWatch(new FileInfo(@"\log4net.config"));
log.Info("Entering application.");
log.Warn("Exiting application.");
XmlConfigurator.ConfigureAndWatch(new FileInfo(@"log4net.config")); // 必须添加此行才能发送日志

无法发送Seq日志的代码

ILog log = LogManager.GetLogger(GetType());
XmlConfigurator.ConfigureAndWatch(new FileInfo(@"\log4net.config"));
log.Info("Entering application.");
log.Warn("Exiting application.");

对应的log4net.config配置

<log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">      
        <!-- 省略配置 -->
    </appender>
    
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
        <!-- 省略配置 -->
    </appender>
    
    <appender name="SeqAppender" type="Seq.Client.Log4Net.SeqAppender, Seq.Client.Log4Net">
      <bufferSize value="100" />      
      <serverUrl value="https://xxx:yy" />
      <apiKey value="" />
      <parameter>
        <parameterName value="Runtime" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value=".NET Framework" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="Config" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="ExternalConfig" />
        </layout>
      </parameter>     
    </appender>
   
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="SeqAppender" />
    </root>
</log4net>

可能的原因

  1. SeqAppender缓冲机制:配置中bufferSize设为100,只有当缓冲日志数量达到100条时才会批量发送到Seq Server。第二次调用ConfigureAndWatch会触发appender重置,强制将缓冲中的日志发送出去。
  2. log4net初始化顺序错误:代码中先获取ILog实例再执行配置,此时Logger已使用默认配置初始化,后续的配置可能无法正确更新该Logger的Appender关联。
  3. Seq.Client.log4Net版本兼容性:3.1.0版本可能存在.NET 6下的初始化bug,导致第一次配置时SeqAppender未正确启动。

解决思路

1. 调整SeqAppender的缓冲配置

强制每条日志立即发送,无需等待缓冲满。修改log4net.config中的SeqAppender配置,添加immediateFlush并缩小bufferSize:

<appender name="SeqAppender" type="Seq.Client.Log4Net.SeqAppender, Seq.Client.Log4Net">
  <bufferSize value="1" />      
  <immediateFlush value="true" /> <!-- 开启立即刷新 -->
  <serverUrl value="https://xxx:yy" />
  <apiKey value="" />
  <!-- 其他参数保持不变 -->
</appender>

2. 修正log4net初始化顺序

确保先执行配置,再获取ILog实例,这样Logger会直接使用正确的配置:

// 先配置log4net
XmlConfigurator.ConfigureAndWatch(new FileInfo(@"\log4net.config"));
// 再获取Logger实例
ILog log = LogManager.GetLogger(GetType());
log.Info("Entering application.");
log.Warn("Exiting application.");

3. 手动触发缓冲刷新

在日志写入完成后,手动获取SeqAppender并调用Flush方法,替代第二次ConfigureAndWatch调用:

ILog log = LogManager.GetLogger(GetType());
XmlConfigurator.ConfigureAndWatch(new FileInfo(@"\log4net.config"));
log.Info("Entering application.");
log.Warn("Exiting application.");

// 手动刷新SeqAppender的缓冲
var logRepository = LogManager.GetRepository();
var seqAppender = logRepository.GetAppenders()
    .OfType<Seq.Client.Log4Net.SeqAppender>()
    .FirstOrDefault();
seqAppender?.Flush();

4. 升级Seq.Client.log4Net版本

检查并升级到最新版本的Seq.Client.log4Net,新版本可能已修复.NET 6下的初始化兼容性问题。

内容的提问来源于stack exchange,提问作者Daniel Devo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:20:24