Serilog 文件日志配置

功能概述

EasyAdminBlazor 自带数据库日志(后台“错误日志”页面查看)。生产环境排查问题时常需要文件日志:把日志写到服务器磁盘上,按天/按大小轮转,方便直接查看和归档。推荐用 Serilog 实现,几行配置即可,且可与框架自带的数据库日志并存。

安装

在项目里添加 NuGet 包(版本请选择与当前 .NET 版本匹配的最新稳定版):

dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File

快速开始

在 Program.cs 的 builder 构建之前加入:

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseSerilog((ctx, cfg) => cfg
    .MinimumLevel.Information()
    .WriteTo.File("logs/log-.log",
        rollingInterval: RollingInterval.Day,        // 按天轮转
        retainedFileCountLimit: 30,                  // 最多保留 30 个文件
        fileSizeLimitBytes: 20 * 1024 * 1024,        // 单文件最大 20MB
        rollOnFileSizeLimit: true,                   // 超过大小自动切新文件
        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}")
    , writeToProviders: true);                       // ⚠️ 关键:保留框架自带日志提供程序

builder.AddEasyAdminBlazor(...);

⚠️ writeToProviders: true 必须加:UseSerilog 默认会替换 ASP.NET Core 的日志提供程序,导致框架自带的数据库日志收不到数据(后台“错误日志”页面停更)。加上这个参数后,Serilog 文件日志与数据库日志并存。

从配置文件读取(推荐)

生产环境建议把日志级别、路径等放配置文件。先安装 Serilog.Settings.Configuration:

dotnet add package Serilog.Settings.Configuration

Program.cs:

builder.Host.UseSerilog((ctx, cfg) => cfg.ReadFrom.Configuration(ctx.Configuration), writeToProviders: true);

appsettings.json:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "logs/log-.log",
          "rollingInterval": "Day",
          "retainedFileCountLimit": 30,
          "fileSizeLimitBytes": 20971520,
          "rollOnFileSizeLimit": true,
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}"
        }
      }
    ]
  }
}

常用配置项

配置项 说明 示例
rollingInterval 轮转周期 Day / Hour / Minute / Infinite
retainedFileCountLimit 最多保留的日志文件数,超出的自动删除 30
fileSizeLimitBytes 单文件大小上限 20971520(20MB)
rollOnFileSizeLimit 达到大小上限是否切新文件 true
shared 多进程共享写同一文件(多实例部署用) true
outputTemplate 每行输出格式 见上文
MinimumLevel 最低日志级别 Warning(生产建议)
MinimumLevel.Override 按命名空间覆盖级别 "Microsoft": "Warning"

与框架数据库日志并存

两套日志各司其职:

  • 数据库日志(框架自带):后台“错误日志”页面查看,方便在管理界面排查
  • 文件日志(Serilog):落盘到服务器,适合直接查看、归档、取证

并存的关键就是 writeToProviders: true。如果你希望只写文件、不要数据库日志,把该参数去掉(或设为 false),注意此时后台“错误日志”页面将不再有数据。

注意:框架的数据库日志只记录 Error 及以上级别(后台“错误日志”页面用于排查错误),所以正常运行的 Information 日志不会出现在该页面;如需查看全量日志请用文件日志。

多实例部署注意事项

  • 默认情况下不要用 shared: true,多个进程写同一文件会互相覆盖;每个实例写自己的目录即可
  • 如果多个实例必须共享同一日志目录,给 File sink 加 shared: true,并注意文件锁与性能
  • 磁盘空间:根据日志量和保留策略(retainedFileCountLimit)控制,避免日志把磁盘写满

性能建议

  • 高吞吐场景可加 Serilog.Sinks.Async 异步写盘,避免日志拖慢请求
  • 生产环境级别建议 Warning 起,避免大量 Information 刷盘

常见问题

  • 日志文件没生成:检查目录是否存在且有写权限;检查 MinimumLevel 是否把目标级别过滤掉了
  • 后台“错误日志”页面没数据了:UseSerilog 替换了默认日志提供程序,检查是否加了 writeToProviders: true
  • 中文乱码:Serilog 默认 UTF-8 输出,正常不会乱码;如使用其它编码可指定 encoding