在C#应用程序开发中,日志系统是保障程序可维护性的核心组件,它可以帮助开发者记录程序运行过程中的关键信息、异常情况和调试数据。ILogger是.NET Core及后续版本中内置的日志抽象接口,提供了统一、灵活的日志记录能力,不需要依赖第三方组件就能实现基础的日志功能。

ILogger基础概念
ILogger位于Microsoft.Extensions.Logging命名空间下,是一个轻量级的日志抽象接口,它不直接实现日志的存储和输出,而是定义了日志记录的通用规范。开发者可以通过不同的日志提供程序,将日志输出到控制台、文件、数据库等不同位置。
常见的日志级别从低到高分为以下几类:
- Trace:最详细的日志信息,通常用于记录调试细节,生产环境一般关闭
- Debug:调试级别的日志,用于开发阶段的调试信息记录
- Information:普通运行信息,记录程序正常运行的关键节点
- Warning:警告信息,记录不影响程序运行但需要注意的异常情况
- Error:错误信息,记录程序运行中出现的异常,导致部分功能失效
- Critical:严重错误信息,记录导致程序崩溃的重大异常
基础环境配置
如果是控制台应用,首先需要安装必要的NuGet包:
// 安装以下NuGet包 // Microsoft.Extensions.Logging // Microsoft.Extensions.Logging.Console // Microsoft.Extensions.DependencyInjection
接下来通过依赖注入的方式配置ILogger,这是.NET中推荐的使用方式:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
class Program
{
static void Main(string[] args)
{
// 创建服务容器
var serviceProvider = new ServiceCollection()
// 添加日志服务,配置控制台日志提供程序
.AddLogging(builder =>
{
builder.AddConsole();
// 设置日志最小输出级别为Information
builder.SetMinimumLevel(LogLevel.Information);
})
.BuildServiceProvider();
// 获取ILogger实例,泛型参数为日志类别,通常用当前类名
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
// 记录不同级别的日志
logger.LogInformation("程序启动成功,当前时间:{Time}", DateTime.Now);
logger.LogWarning("检测到配置项缺失,使用默认配置");
try
{
// 模拟异常操作
int a = 10;
int b = 0;
int c = a / b;
}
catch (Exception ex)
{
// 记录异常日志,自动包含异常堆栈信息
logger.LogError(ex, "执行除法操作时出现异常");
}
}
}
在ASP.NET Core中使用ILogger
ASP.NET Core项目默认已经集成了ILogger和依赖注入,不需要额外配置基础服务,直接在需要使用的类中注入即可:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
private readonly ILogger<UserController> _logger;
// 构造函数注入ILogger
public UserController(ILogger<UserController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult GetUser(int id)
{
_logger.LogInformation("开始查询用户ID:{UserId}", id);
if (id <= 0)
{
_logger.LogWarning("传入的用户ID不合法:{UserId}", id);
return BadRequest("用户ID必须大于0");
}
// 模拟用户查询逻辑
var user = new { Id = id, Name = "测试用户" };
_logger.LogInformation("用户查询成功,用户信息:{UserInfo}", user);
return Ok(user);
}
}
自定义日志输出格式
如果需要自定义日志的输出格式,比如添加自定义字段、调整时间格式,可以实现自定义的日志提供程序。以下是一个简单的自定义控制台日志提供程序示例:
using Microsoft.Extensions.Logging;
// 自定义日志提供程序
public class CustomConsoleLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new CustomConsoleLogger(categoryName);
}
public void Dispose() { }
}
// 自定义日志实现类
public class CustomConsoleLogger : ILogger
{
private readonly string _categoryName;
public CustomConsoleLogger(string categoryName)
{
_categoryName = categoryName;
}
public IDisposable BeginScope<TState>(TState state) => null;
public bool IsEnabled(LogLevel logLevel) => true;
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel)) return;
// 自定义输出格式:[时间] [级别] [类别] 消息
var message = formatter(state, exception);
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [{logLevel}] [{_categoryName}] {message}");
if (exception != null)
{
Console.WriteLine($"异常信息:{exception.Message}");
}
}
}
注册自定义日志提供程序的方式如下:
var serviceProvider = new ServiceCollection()
.AddLogging(builder =>
{
// 添加自定义日志提供程序
builder.AddProvider(new CustomConsoleLoggerProvider());
builder.SetMinimumLevel(LogLevel.Debug);
})
.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogDebug("这是自定义格式的调试日志");
使用注意事项
在使用ILogger时需要注意以下几点:
- 日志级别要根据实际场景选择,生产环境不要开启Trace和Debug级别,避免产生大量无用日志
- 日志消息中尽量使用结构化参数,比如
logger.LogInformation("用户{UserId}登录成功", userId),而不是字符串拼接,这样方便后续的日志检索和分析 - 不要在日志中记录敏感信息,比如用户密码、身份证号、支付密钥等内容
- 如果需要记录复杂的对象,建议先序列化为字符串再记录,避免直接传入对象导致日志输出异常