Z
ZHANK
进阶工程

日志与监控

ILogger 日志、Serilog 集成、结构化日志、请求追踪

日志与监控

ASP.NET Core 内置了 ILogger<T> 接口,配合 Serilog 等库实现结构化日志——可搜索、可分析。

学完本章你将: 掌握 ILogger 日志、Serilog 集成、结构化日志。


ILogger 基础

csharp
public class UserService
{
    private readonly ILogger<UserService> _logger;

    public UserService(ILogger<UserService> logger) => _logger = logger;

    public async Task<User?> GetUserAsync(int id)
    {
        _logger.LogInformation("查询用户 {UserId}", id);

        try
        {
            var user = await _repo.FindAsync(id);
            _logger.LogDebug("查询结果: {@User}", user);
            return user;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "查询用户 {UserId} 失败", id);
            throw;
        }
    }
}

Serilog 集成

csharp
// NuGet: Serilog.AspNetCore

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("logs/app.log", rollingInterval: RollingInterval.Day)
    .CreateLogger();

builder.Host.UseSerilog();

结构化日志的价值

csharp
// ❌ 字符串拼接——无法搜索
_logger.LogInformation($"用户 {name}{time} 登录");

// ✅ 结构化日志——按属性搜索
_logger.LogInformation("用户登录 {UserName} {LoginTime}", name, time);
// 在 Seq/Elasticsearch 中可搜: UserName = "小明"