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. 日志格式统一、可收集、可排查
相关推荐
fuquxiaoguang1 天前
MCP协议移交Linux基金会:AI智能体中间件标准定型,国产厂商迎“Kubernetes时刻”
linux·人工智能·中间件
谁看我谁 狼家二丫2 天前
[MAF预定义ChatClient中间件-06]利用ImageGeneratingChatClient开发专业图片生成Agent
中间件
q567315232 天前
Scrapy 框架集成稳定 HTTP 代理:中间件配置与断线重试实战
爬虫·网络协议·scrapy·http·中间件·http代理
phltxy2 天前
LangChain_Agent中间件实战
人工智能·python·深度学习·语言模型·中间件·langchain
程序员良辰2 天前
【TongWeb7启动报错】TongWeb控制台可以访问,但是应用访问404
java·开发语言·中间件
智码看视界2 天前
Day33-数据层 × 中间件AI化篇:Redis缓存经典问题-击穿、穿透、雪崩的终极解决方案
数据库·redis·缓存·中间件·穿透·雪崩·击穿
Maiko Star3 天前
FastAPI 进阶三部曲:中间件、依赖注入与 ORM 实战
python·中间件·fastapi
憧憬成为java架构高手的小白5 天前
黑马八股--中间件学习之MQ(RabbitMQ)
学习·中间件
weixin_727535626 天前
MinIO大文件上传深度拆解:从原理到生产落地的完整指南
java·中间件
jieyucx7 天前
Nuxt4阶段六:工程化与进阶 —— 模块、中间件、插件、TS 与测试
中间件·vue·web·nuxt·全栈·ssr