You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.NET 8的Serilog中按类型分文件存储日志的实现方法

解决方案

一、修正appsettings.json配置

你需要在WriteTo数组中添加两个独立的File sink,分别配置过滤规则对应不同日志文件。以下是完整可生效的配置:

{
  "Serilog": {
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.File",
      "Serilog.Filters.Expressions" // 必须添加此依赖,否则过滤表达式无效
    ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore.Mvc": "Warning",
        "Microsoft.AspNetCore.Routing": "Warning",
        "Microsoft.AspNetCore.Hosting": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      // EF Core查询日志专属sink
      {
        "Name": "File",
        "Args": {
          "path": "Logs/log-.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
          "fileSizeLimitBytes": 10485760,
          "rollOnFileSizeLimit": true,
          "shared": true,
          "flushToDiskInterval": 1
        },
        "Filter": [
          {
            "Name": "ByIncluding",
            "Args": {
              "expression": "StartsWith(SourceContext, 'Microsoft.EntityFrameworkCore.Database')"
            }
          }
        ]
      },
      // API请求日志专属sink
      {
        "Name": "File",
        "Args": {
          "path": "Logs/request-.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {RequestPath} {Message:lj}{NewLine}{Exception}",
          "fileSizeLimitBytes": 10485760,
          "rollOnFileSizeLimit": true,
          "shared": true,
          "flushToDiskInterval": 1
        },
        "Filter": [
          {
            "Name": "ByIncluding",
            "Args": {
              "expression": "StartsWith(SourceContext, 'YourProjectNamespace.Controllers') or Contains(SourceContext, 'Microsoft.AspNetCore.HttpLogging')"
            }
          }
        ]
      }
    ],
    "Enrich": [
      "FromLogContext"
    ]
  },
  "AllowedHosts": "*"
}

关键注意事项:

  1. 执行命令安装缺失的过滤包:
    dotnet add package Serilog.Filters.Expressions
    
  2. API日志的过滤表达式需根据实际调整:
    • 替换YourProjectNamespace.Controllers为你项目中控制器的命名空间
    • 若需捕获完整HTTP请求日志,需先在Program.cs中启用AddHttpLogging和UseHttpLogging中间件

二、Program.cs代码配置方案

如果配置文件方式仍有问题,可直接通过代码硬编码实现,逻辑更直观:

using Serilog;
using Serilog.Filters;

var builder = WebApplication.CreateBuilder(args);

// 配置Serilog
builder.Host.UseSerilog((context, config) =>
{
    config
        .MinimumLevel.Information()
        .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", Serilog.Events.LogEventLevel.Warning)
        .MinimumLevel.Override("Microsoft.AspNetCore.Routing", Serilog.Events.LogEventLevel.Warning)
        .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", Serilog.Events.LogEventLevel.Warning)
        .Enrich.FromLogContext()
        // 输出到控制台
        .WriteTo.Console()
        // EF Core日志输出到log-.txt
        .WriteTo.File(
            path: "Logs/log-.txt",
            rollingInterval: RollingInterval.Day,
            outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
            fileSizeLimitBytes: 10485760,
            rollOnFileSizeLimit: true,
            shared: true,
            flushToDiskInterval: TimeSpan.FromSeconds(1))
        .Filter.ByIncludingOnly(evt => evt.SourceContext?.StartsWith("Microsoft.EntityFrameworkCore.Database") == true)
        // API请求日志输出到request-.txt
        .WriteTo.File(
            path: "Logs/request-.txt",
            rollingInterval: RollingInterval.Day,
            outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {RequestPath} {Message:lj}{NewLine}{Exception}",
            fileSizeLimitBytes: 10485760,
            rollOnFileSizeLimit: true,
            shared: true,
            flushToDiskInterval: TimeSpan.FromSeconds(1))
        .Filter.ByIncludingOnly(evt => 
            evt.SourceContext != null && 
            (evt.SourceContext.StartsWith("YourProjectNamespace.Controllers") || evt.SourceContext.Contains("Microsoft.AspNetCore.HttpLogging")));
});

// 启用HTTP请求日志捕获(可选,如需完整请求信息)
builder.Services.AddHttpLogging(options =>
{
    options.LoggingFields = Microsoft.AspNetCore.HttpLogging.HttpLoggingFields.All;
});

builder.Services.AddControllers();

var app = builder.Build();

// 启用HTTP日志中间件
app.UseHttpLogging();

app.UseAuthorization();

app.MapControllers();

app.Run();

代码配置说明:

  • 通过Filter.ByIncludingOnly为每个File sink单独设置过滤规则
  • 若需捕获完整HTTP请求/响应数据,必须添加AddHttpLogging和UseHttpLogging中间件

内容的提问来源于stack exchange,提问作者JOYBOY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:05:18