Serilog 及其 sinks 吸入控制台,文件和sqlserver数据库

79 阅读4分钟

下面详细介绍在 ASP.NET Core Web API 项目中,使用 Serilog 及其 sinks(控制台、文件、SQL Server)输出日志的完整步骤和配置方法。


1. 安装 NuGet 包

在项目根目录下执行:

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

2. 配置 appsettings.json

添加 Serilog 配置节,示例:

{
  "Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "Logs/log-.txt",
          "rollingInterval": "Day"
        }
      },
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "Server=localhost;Database=LogDb;Trusted_Connection=True;",
          "tableName": "Logs",
          "autoCreateSqlTable": true
        }
      }
    ]
  }
}

说明:

  • MinimumLevel:日志最低级别(如 Information、Warning、Error)。
  • WriteTo:配置多个 sink,分别输出到控制台、文件和 SQL Server。
  • File sink 支持按天滚动日志文件。
  • MSSqlServer sink 可自动建表(autoCreateSqlTable),如需自定义表结构可参考官方文档。

3. 在 Program.cs 中集成 Serilog

ASP.NET Core 6+ 推荐写法:

using Serilog;

var builder = WebApplication.CreateBuilder(args);

// 读取配置并初始化 Serilog
builder.Host.UseSerilog((context, services, configuration) =>
{
    configuration
        .ReadFrom.Configuration(context.Configuration)
        .ReadFrom.Services(services);
});

builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

4. 在代码中使用日志

控制器示例:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

[ApiController]
[Route("[controller]")]
public class DemoController : ControllerBase
{
    private readonly ILogger<DemoController> _logger;

    public DemoController(ILogger<DemoController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IActionResult Get()
    {
        _logger.LogInformation("访问了 DemoController 的 Get 方法");
        return Ok("日志已记录");
    }
}

5. SQL Server 日志表说明

如果设置了 autoCreateSqlTable: true,Serilog 会自动在数据库中创建 Logs 表。
如需自定义表结构或字段映射,可参考 Serilog.Sinks.MSSqlServer 文档


总结

  1. 安装 Serilog 及所需 sinks 的 NuGet 包。
  2. appsettings.json 配置日志输出目标和参数。
  3. Program.cs 集成 Serilog。
  4. 通过依赖注入的 ILogger<T> 在代码中记录日志。
  5. SQL Server sink 可自动建表,支持高性能日志存储。

如需更复杂的日志格式、字段映射或异步写入,可查阅 Serilog 官网 和各 sink 的详细文档。

在 Serilog 文件日志(File Sink)中,通过 rollingInterval 和日志文件管理策略,可以让日志文件按天滚动,并通过外部工具(如定时任务)定期清理 30 天前的日志文件,但 Serilog 本身不自动删除旧文件,需要你用脚本或第三方工具定期清理。

在 SQL Server Sink 中,Serilog 本身不支持自动清理数据库中过期日志。要实现“只保存1年日志”,通常做法是:

  1. Serilog 正常写入日志到 SQL Server。
  2. 通过 SQL Server 的定时任务(如 SQL Agent Job)定期删除超过1年的日志。

SQL Server 日志保留一年实现方法

1. Serilog 正常写入日志(参考前述配置)

2. 在 SQL Server 中创建定时清理任务

假设日志表为 Logs,有 TimeStamp 字段(Serilog 默认字段),可用如下 SQL 脚本:

DELETE FROM Logs
WHERE TimeStamp < DATEADD(year, -1, GETDATE())

3. 设置 SQL Server Agent Job

  • 在 SQL Server Management Studio(SSMS)中,进入“SQL Server Agent”。
  • 新建 Job,步骤为执行上述 SQL 脚本。
  • 设置 Job 每天或每周自动运行。

总结

  • 文件日志:Serilog 只负责滚动和写入,旧文件需用脚本或工具定期清理。
  • SQL Server 日志:Serilog 只负责写入,保留策略需用 SQL Server Job 定期删除旧数据。

示例:SQL Server 清理脚本

-- 删除1年前的日志
DELETE FROM Logs
WHERE TimeStamp < DATEADD(year, -1, GETDATE())

你可以将此脚本设置为 SQL Server Agent 的定时任务,实现自动清理。


说明: Serilog 负责写入,日志保留策略由存储系统(文件系统、数据库)负责。
如需自动化,建议结合定时任务或第三方工具。

rollingInterval 只是让 Serilog 文件日志按天(或按小时、按月等)分割保存,比如每天生成一个新日志文件(如 log-20251008.txt)。
它不会自动删除旧文件,只是把日志分成多个文件,方便管理和查找。

如果你希望“仅保存30天”,还需要额外的清理操作,比如:

  • 用 Windows 计划任务或 Linux 定时任务(如 cron)定期删除 30 天前的日志文件。
  • Serilog 本身没有自动删除旧文件的功能。

示例:Windows 批处理定期清理日志文件

forfiles /p "Logs" /s /m *.txt /d -30 /c "cmd /c del @file"

(每天执行一次,删除 Logs 文件夹下 30 天前的日志)


总结:

  • rollingInterval 只负责分割日志文件,不会自动删除旧文件。
  • 需要结合系统定时任务实现日志文件的自动清理。