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. 日志格式统一、可收集、可排查
相关推荐
好奇的菜鸟18 小时前
Java开发常用中间件,Docker安装。
java·docker·中间件
qq_283720052 天前
LangChain 动态模型中间件实战使用技巧
中间件·langchain·middleware·wrap_model_call
晚风_END2 天前
Linux|操作系统|最新版openzfs编译记录
linux·运维·服务器·数据库·spring·中间件·个人开发
运维全栈笔记4 天前
Linux安装配置Tomcat保姆级教程:从部署到性能调优
linux·服务器·中间件·tomcat·apache·web
许长安5 天前
protobuf 使用详解
c++·经验分享·笔记·中间件
jeCA EURG6 天前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
许彰午8 天前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
亿牛云爬虫专家9 天前
Go爬虫进阶:如何优雅地在Colly框架中实现无缝代理切换?
爬虫·中间件·golang·爬虫代理·colly框架·代理切换·api提取
SuperherRo9 天前
服务攻防-中间件安全&Apache&Tomcat&Jetty&Weblogic&AJP协议&反序列化&CVE漏洞
中间件·tomcat·apache·jetty·weblogic
空中海9 天前
第四篇:进阶篇 — 缓存、消息队列、安全与常用中间件
安全·缓存·中间件