Day15-1:日志 中间件/过滤器、Serilog 的配合使用

结论

  1. 日志中间件 = 请求日志的切面(AOP)
  2. Serilog = 真正的日志框架(记录、文件、控制台、格式化)
  3. 最佳实践:两个必须配合使用!

一、它们到底是什么?

1. 写的 日志中间件 / 过滤器(中间件/过滤器 的对比选择)

作用:

  • 拦截请求
  • 输出 请求路径、方法、耗时、状态码
  • 属于业务 / 请求层面的日志

不负责

  • 日志写入文件
  • 日志格式化
  • 日志分级(Info/Warn/Error)
  • 日志滚动、清理

它只是 **"日志的来源"**。


2. Serilog

作用:

  • 真正的日志系统
  • 把日志输出到:控制台、文件、ES、数据库等
  • 支持结构化日志
  • 自动切割文件、自动清理
  • 企业级标配

它是 **"日志的输出工具"**。

二、正确关系

日志中间件(产生日志) → Serilog(输出日志)

就像:

  • 过滤器 / 中间件 = 说话的人
  • Serilog = 麦克风 + 音响 + 录音设备

三、企业标准用法(你必须这么写)

1. 用 Serilog 接管整个程序的日志(Program.cs)

2. 日志中间件 不直接用 Console.WriteLine

3. 日志中间件 调用 Serilog 记录请求日志

四、企业级最终代码(复制即用)

第一步:安装 Serilog 包(DDD四层架构安装结构)

cs 复制代码
Serilog
Serilog.AspNetCore
Serilog.Sinks.Console
Serilog.Sinks.File

第二步:appsettings.json配置

cs 复制代码
//添加 Serilog 配置
"Serilog": {
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "Microsoft": "Warning",
      "System": "Warning"
    }
  },
  "WriteTo": [
    { "Name": "Console" },
    {
      "Name": "File",
      "Args": {
        "path": "Logs/log-.txt",
        "rollingInterval": "Day",
        "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
      }
    }
  ]
}

第三步:LogMiddleware.cs 日志中间件(使用 Serilog)

cs 复制代码
public class LogMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<LogMiddleware> _logger;

    // 直接注入 Serilog 的 ILogger
    public LogMiddleware(RequestDelegate next, ILogger<LogMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var path = context.Request.Path;
        var method = context.Request.Method;

        _logger.LogInformation($"【请求开始】{method} {path}");

        var stopwatch = Stopwatch.StartNew();
        await _next(context);
        stopwatch.Stop();

        _logger.LogInformation($"【请求结束】{method} {path} | 耗时:{stopwatch.ElapsedMilliseconds}ms");
    }
}

第四步:Program.cs 注册使用 (将中间件封装成扩展方法)

cs 复制代码
//Serilog 注册(用 Serilog 替换默认日志)
builder.Host.UseSerilog((ctx, cfg) =>
{
    cfg.ReadFrom.Configuration(ctx.Configuration);// 从 appsettings.json 读取日志配置
});


//................


app.UseLogMiddleware();

五、最终效果

  1. 控制台漂亮输出日志
  2. 自动生成 Logs/log-20251225.txt 日志文件
  3. 全局异常、请求、业务都统一用 Serilog 记录
  4. 日志格式统一、可收集、可排查
相关推荐
阿昌喜欢吃黄桃2 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙3 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-3 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH2312114 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会5 天前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了5 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路5 天前
消息中间件
中间件
都说名字长不会被发现5 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室6 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆6 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express