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 天前
【Docker部署插件】:使用 Docker 部署生产级 Kafka 完整版教程
安全·docker·中间件·kafka·消息队列·docker-compose·后端开发
川石课堂软件测试3 天前
性能测试|Nginx中间件监控与调优
linux·python·nginx·中间件·单元测试·压力测试·harmonyos
满怀冰雪4 天前
24_中间件系统源码分析_Middleware链的洋葱模型与异常处理
人工智能·python·中间件·langchain
糖果店的幽灵5 天前
langchain 所有内置中间件最详细解析
中间件·langchain
ASKCOS6 天前
DeerFlow Agent 中间件架构:用插件化链彻底告别 Agent 继承式开发
中间件·架构
阿昌喜欢吃黄桃23 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙24 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-24 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH23121125 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会25 天前
双Token机制在实际项目中的应用与实践
中间件·token