日志管理
项目采用 Microsoft.Extensions.Logging 日志框架,支持多环境配置、日志级别过滤等特性。
日志框架
技术选型
| 框架 | 说明 |
|---|---|
| Microsoft.Extensions.Logging | .NET 内置日志抽象 |
| Serilog | 结构化日志(可选) |
日志级别
日志级别从低到高:
Trace < Debug < Information < Warning < Error < Critical| 级别 | 说明 | 适用场景 |
|---|---|---|
| Trace | 追踪信息 | 调试时详细跟踪 |
| Debug | 调试信息 | 开发环境调试 |
| Information | 普通信息 | 关键业务节点 |
| Warning | 警告信息 | 潜在问题提示 |
| Error | 错误信息 | 异常情况记录 |
| Critical | 严重错误 | 系统级故障 |
配置文件
appsettings.json 配置
json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.EntityFrameworkCore": "Warning"
}
}
}开发环境配置
json
// appsettings.Development.json
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft.AspNetCore": "Information"
}
}
}生产环境配置
json
// appsettings.Production.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}日志使用
基本用法
csharp
using Microsoft.Extensions.Logging;
public class UserService
{
private readonly ILogger<UserService> _logger;
public UserService(ILogger<UserService> logger)
{
_logger = logger;
}
public void CreateUser(UserForm form)
{
_logger.LogInformation("创建用户: {Username}", form.Username);
_logger.LogDebug("用户详情: {@Form}", form);
_logger.LogError("创建用户失败: {Username}", form.Username);
}
}日志级别使用规范
| 级别 | 使用场景 | 示例 |
|---|---|---|
| Debug | 调试信息、详细参数 | _logger.LogDebug("查询参数: {@Params}", params) |
| Information | 关键业务节点 | _logger.LogInformation("用户登录成功: {Username}", username) |
| Warning | 潜在问题、降级处理 | _logger.LogWarning("缓存失效,回源数据库") |
| Error | 异常情况、错误记录 | _logger.LogError(e, "订单创建失败: {OrderId}", orderId) |
结构化日志
csharp
// ✅ 推荐:结构化日志
_logger.LogInformation("用户 {Username} 登录成功,IP: {Ip}", username, ip);
// ❌ 不推荐:字符串拼接
_logger.LogInformation($"用户 {username} 登录成功,IP: {ip}");异常日志
csharp
try
{
await _orderService.CreateOrderAsync(order);
}
catch (Exception ex)
{
_logger.LogError(ex, "订单创建失败: OrderId={OrderId}", order.Id);
}Serilog 集成(可选)
安装依赖
xml
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.0" />配置 Serilog
csharp
// Program.cs
using Serilog;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Host.UseSerilog();输出格式
2024-01-15 10:30:45.123 +08:00 [INF] 用户登录成功 admin
2024-01-15 10:30:46.456 +08:00 [ERR] 订单创建失败 OrderId=12345Docker 日志管理
目录挂载
yaml
# docker-compose.yml
services:
youlai-aspnet:
volumes:
- /logs/youlai-aspnet:/app/logs日志查看
bash
# 查看容器日志
docker logs youlai-aspnet
# 实时跟踪
docker logs -f youlai-aspnet
# 查看最近 100 行
docker logs --tail 100 youlai-aspnet日志最佳实践
敏感信息脱敏
csharp
// ❌ 不推荐:记录敏感信息
_logger.LogInformation("用户登录: Password={Password}", password);
// ✅ 推荐:脱敏处理
_logger.LogInformation("用户登录: Phone={Phone}", MaskPhone(phone));
private static string MaskPhone(string phone)
{
if (string.IsNullOrEmpty(phone) || phone.Length < 7)
return phone;
return phone[..3] + "****" + phone[^4..];
}性能优化
csharp
// ✅ 推荐:使用条件判断(Debug 级别未开启时不执行)
if (_logger.IsEnabled(LogLevel.Debug))
{
_logger.LogDebug("复杂对象序列化: {Json}", JsonSerializer.Serialize(obj));
}相关文件
| 文件 | 说明 |
|---|---|
appsettings.json | 日志级别配置 |
appsettings.Development.json | 开发环境配置 |
appsettings.Production.json | 生产环境配置 |
