.NET 8中Log4Net仅记录ERROR/CRITICAL级别日志问题求助
问题分析与解决方案
1. .NET日志级别与Log4Net级别映射偏差
.NET 8的Microsoft.Extensions.Logging日志系统与Log4Net的级别默认映射可能存在问题,导致INFO、WARN级别的日志未被正确转发到Log4Net。
解决方法
在配置Log4Net日志提供者时,手动指定完整的级别映射关系:
using log4net.Core; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Log4Net.AspNetCore; var builder = WebApplication.CreateBuilder(args); // 清除默认日志提供者,避免干扰 builder.Logging.ClearProviders(); // 添加Log4Net并配置级别映射 builder.Logging.AddLog4Net(new Log4NetProviderOptions { LogLevelOverrides = new Dictionary<LogLevel, Level> { { LogLevel.Trace, Level.Trace }, { LogLevel.Debug, Level.Debug }, { LogLevel.Information, Level.Info }, { LogLevel.Warning, Level.Warn }, { LogLevel.Error, Level.Error }, { LogLevel.Critical, Level.Fatal }, { LogLevel.None, Level.Off } } });
2. Log4Net配置文件未正确加载
.NET 8中若log4net.config未设置为复制到输出目录,应用无法读取配置,会默认仅记录ERROR及以上级别日志。
解决方法
右键项目中的log4net.config文件 → 属性 → 复制到输出目录,选择如果较新则复制或始终复制。
若配置文件存放在子目录,可手动指定路径:
builder.Logging.AddLog4Net("Configs/log4net.config");
3. 验证包版本兼容性
确保使用适配.NET 8的Log4Net相关包:
- 安装最新稳定版
log4net(版本≥2.0.15) - ASP.NET Core应用需安装
Microsoft.Extensions.Logging.Log4Net.AspNetCore(版本≥6.0.0,支持.NET 8)
4. 检查过滤器配置逻辑
你的配置中LevelRangeFilter设置了levelMin="INFO"、levelMax="FATAL",理论上应包含INFO、WARN、ERROR、FATAL级别日志。可临时注释过滤器测试:
<!-- 临时注释过滤器,验证是否能输出所有级别 --> <!-- <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO" /> <levelMax value="FATAL" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> -->
若移除后日志正常输出,再检查过滤器是否存在拼写错误(Log4Net的级别名称为INFO、WARN、ERROR、FATAL,无CRITICAL)。
5. 权限验证
确认应用运行身份对C:\AppPath\目录有读写权限(比如IIS应用池身份、控制台应用当前用户),虽然你能看到ERROR日志,但权限不足可能导致部分级别日志无法写入(概率较低,可作为排除项)。
内容的提问来源于stack exchange,提问作者user3865946
相关产品推荐
相关产品推荐

