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

.Net Framework 4.5.2项目主Log4Net正常但嵌套日志器失效求助

Log4Net子项目日志无效问题排查方案

1. 检查日志器继承与配置覆盖

Log4Net的日志器按命名空间/类型全名分层继承,子项目用DeclaringType获取的日志器名称是完整的类型路径(如YourCompany.SubProject.YourClass),如果配置里没有给这个路径或其父命名空间配置Appender,就会导致Appender数量为0。

  • 确保根日志器(<root>)关联了Appender,这样所有未单独配置的日志器都会继承根的配置:
    <root>
      <level value="INFO" />
      <appender-ref ref="你的主项目Appender1" />
      <appender-ref ref="你的主项目Appender2" />
    </root>
    
  • 或者给子项目的命名空间单独配置日志器,复用主项目的Appender:
    <logger name="YourCompany.SubProject" additivity="true">
      <level value="INFO" />
      <appender-ref ref="你的主项目Appender1" />
      <appender-ref ref="你的主项目Appender2" />
    </logger>
    

2. 统一Log4Net初始化时机

子项目的[assembly: XmlConfigurator(Watch = true)]可能因为主项目先初始化了Log4Net而失效——Log4Net默认只会加载一次配置。

  • 移除所有子项目的XmlConfigurator属性,在主项目入口(如Program.cs)显式加载配置:
    // 主项目入口处执行
    log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
    
    这样所有项目的日志器都会共享同一个配置文件,避免子项目的配置属性被忽略。

3. 验证日志器名称匹配

调试时输出子项目日志器的完整名称,确认是否和配置中的节点匹配:

var logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Console.WriteLine($"子项目日志器名称:{logger.Name}");

如果输出的名称在配置中没有对应的<logger>节点,就需要调整配置,要么给该名称配置Appender,要么依赖根日志器的继承。

4. 检查配置文件复制属性

如果主项目的log4net.config没有被复制到输出目录,或者子项目有单独的配置文件但未设置复制属性,会导致Log4Net加载不到配置。

  • 右键主项目的log4net.config → 属性 → 复制到输出目录,设置为始终复制或如果较新则复制。

5. 确认Additivity属性

如果子项目对应的日志器被显式设置了additivity="false",会阻止它继承父日志器的Appender。检查配置中的<logger>节点,确保没有设置additivity="false"(默认值为true)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:56:02