Skip to content

日志管理

项目采用 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=12345

Docker 日志管理

目录挂载

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生产环境配置

参考资料

基于 MIT 许可发布