.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
相关产品推荐
相关产品推荐

