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. 日志格式统一、可收集、可排查
相关推荐
海市公约1 天前
FastAPI中间件与依赖系统实战指南
中间件·fastapi·依赖注入·异步编程·web架构·代码复用·拦截器模式
8Qi82 天前
RabbitMQ高级篇:消息可靠性、幂等性与延迟消息
java·分布式·微服务·中间件·rabbitmq·springcloud
fuquxiaoguang2 天前
中间件行业产品市场洞察报告 – 2026年第一季度
中间件·市场洞察
fuquxiaoguang2 天前
灰度·熵减·长期主义:任正非心智模型下的中国中间件技术突围与未来
中间件·任正非
van久3 天前
Day10:ASP.NET Core 管道与中间件
中间件
We་ct3 天前
JS手撕:手写Koa中间件与Promise核心特性
开发语言·前端·javascript·中间件·node.js·koa·co
Meme Buoy6 天前
13.6其他架构评估方法-中间件
中间件·架构
我是李龙7 天前
第二十六章 全链路监控体系: 服务器资源、中间件状态与业务指标的可视化大屏开发
中间件
别抢我的锅包肉8 天前
FastAPI + Vue3 + Vite 跨域报错全解:从 `Access-Control-Allow-Origin missing` 到彻底修复
中间件·状态模式·fastapi