WPF应用使用Log4Net出现‘尝试为root设置null级别’错误求助
我来帮你排查这个log4net的错误问题——虽然你的日志记录正常,但输出窗口的错误确实是配置或者初始化环节出了小问题,咱们一步步来解决:
你看到的log4net:ERROR You have tried to set a null level to root和log4net.Core.LogException错误,本质是log4net在解析根日志器(root)的级别时,没有正确读取到配置里的WARNING值,导致拿到了null值触发错误。日志还能正常工作,大概率是log4net fallback到了默认配置,但这个错误还是得修复。
下面是几种常见的修复步骤,按优先级尝试:
1. 检查配置文件的输出属性
首先确认你的log4net配置文件(不管是内嵌在App.config里,还是单独的log4net.config)的复制到输出目录属性设置正确:
- 在Visual Studio里右键点击配置文件 → 属性
- 把“复制到输出目录”改成如果较新则复制或者始终复制
- 这一步很关键,如果运行时程序找不到配置文件,log4net就会用默认的空配置,自然会出现root level为null的错误。
2. 确认log4net的初始化代码正确
在WPF应用中,一定要在应用启动的早期正确初始化log4net,推荐在App.xaml.cs的OnStartup方法里添加初始化代码:
protected override void OnStartup(StartupEventArgs e) { // 如果配置在App.config里 log4net.Config.XmlConfigurator.Configure(); // 如果是单独的log4net.config文件,用下面的代码 // var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"); // log4net.Config.XmlConfigurator.Configure(new FileInfo(configPath)); base.OnStartup(e); }
注意:不要重复调用初始化方法,多次初始化可能导致配置重复解析,触发LogException。
3. 检查配置文件的XML结构
如果你的配置是放在App.config里,要确保<log4net>节点是嵌套在<configuration>节点下的,正确结构应该是:
<configuration> <!-- 其他配置节点(比如appSettings等) --> <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="c:\temp\logs\UtexbelAppLog.txt"></file> <appendToFile value="true"></appendToFile> <rollingStyle value="Size"></rollingStyle> <maximumFileSize value="1MB"></maximumFileSize> <maxSizeRollBackups value="5"></maxSizeRollBackups> <staticLogFileName value="true"></staticLogFileName> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date{dd-MM-yyyy HH:mm:ss} %level - %message - %line%newline%exception"></conversionPattern> </layout> </appender> <root> <level value="WARNING"></level> <appender-ref ref="RollingFileAppender"></appender-ref> </root> </log4net> </configuration>
如果是单独的log4net.config文件,根节点直接是<log4net>就没问题,你的现有配置结构是对的,这一步主要是排查嵌套错误。
4. 验证log4net版本兼容性
虽然可能性较低,但如果你的log4net版本比较旧,可能对日志级别的大小写有严格要求,你可以尝试把<level value="WARNING">改成小写的<level value="warn">(这是log4net的级别别名),看看错误是否消失。
完成上面的步骤后,清理解决方案,重新生成,然后运行应用,查看输出窗口,应该就不会再出现那两个重复的错误了。
内容的提问来源于stack exchange,提问作者Hans

