一、核心概念
- ASP.NET Core 6:微软推出的跨平台 Web 框架,极简模式(Top-level statements)是它的标志性变化
- Log4net:老牌 .NET 日志框架,支持多输出源(文件、控制台、数据库等)、灵活的日志级别控制,是企业级应用中非常常用的日志方案
- 适配方式:通过
Microsoft.Extensions.Logging.Log4Net.AspNetCore包,让 log4net 适配 .NET Core 的标准日志接口
二、完整集成步骤
1. 安装 NuGet 包
在项目中安装以下两个包:
bash
运行
Install-Package log4net Install-Package Microsoft.Extensions.Logging.Log4Net.AspNetCore2. 添加 log4net 配置文件
在项目根目录新建log4net.config,并设置属性为 “复制到输出目录:如果较新则复制”。示例配置(控制台 + 文件双输出):
xml
<?xml version="1.0" encoding="utf-8" ?> <log4net> <!-- 控制台输出 --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <!-- 文件输出(按日期滚动) --> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="logs/" /> <datePattern value="yyyy-MM-dd'.log'" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <maxSizeRollBackups value="10" /> <staticLogFileName value="false" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <!-- 根日志配置 --> <root> <level value="Info" /> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="RollingFileAppender" /> </root> </log4net>3. 在 Program.cs 中注册 log4net
csharp
运行
var builder = WebApplication.CreateBuilder(args); // 1. 添加 log4net 日志提供程序 builder.Logging.AddLog4Net("log4net.config"); // 其他服务注册(比如控制器、Swagger 等) builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 中间件配置 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();4. 在控制器中使用日志
直接通过依赖注入ILogger<T>即可,不需要手动创建 log4net 对象:
csharp
运行
[ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet(Name = "GetWeatherForecast")] public IActionResult Get() { _logger.LogInformation("开始获取天气数据"); _logger.LogDebug("调试信息:参数xxx"); _logger.LogWarning("警告:数据可能存在延迟"); _logger.LogError("模拟错误:数据获取失败", new Exception("测试异常")); return Ok(Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray()); } }三、常见问题与优化
日志文件不生成?
- 检查
log4net.config的 “复制到输出目录” 设置 - 确认
logs目录的写入权限 - 检查配置文件中的路径是否正确
- 检查
日志级别不生效?
- 根节点的
<level value="Info" />控制全局最低级别 - 也可以单独为某个命名空间设置级别,比如:
xml
<logger name="Microsoft.AspNetCore"> <level value="Warning" /> </logger>
- 根节点的
性能优化建议
- 生产环境关闭
Debug级别的日志 - 对于高频日志,使用异步写入的
BufferingForwardingAppender - 日志文件按日期 / 大小滚动,避免单个文件过大
- 生产环境关闭
四、扩展:为什么用 Log4net?
- 成熟稳定:经过多年企业级项目验证,生态完善
- 配置灵活:支持多输出源、过滤规则、自定义布局
- 无缝适配:完美兼容 .NET Core 的标准日志接口,不需要修改业务代码
- 社区支持:大量现成的配置模板和问题解决方案