.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>
可能的原因
- SeqAppender缓冲机制:配置中
bufferSize设为100,只有当缓冲日志数量达到100条时才会批量发送到Seq Server。第二次调用ConfigureAndWatch会触发appender重置,强制将缓冲中的日志发送出去。 - log4net初始化顺序错误:代码中先获取
ILog实例再执行配置,此时Logger已使用默认配置初始化,后续的配置可能无法正确更新该Logger的Appender关联。 - 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
相关产品推荐
相关产品推荐

