下面详细介绍在 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。Filesink 支持按天滚动日志文件。MSSqlServersink 可自动建表(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 文档。
总结
- 安装 Serilog 及所需 sinks 的 NuGet 包。
- 在
appsettings.json配置日志输出目标和参数。 - 在
Program.cs集成 Serilog。 - 通过依赖注入的
ILogger<T>在代码中记录日志。 - SQL Server sink 可自动建表,支持高性能日志存储。
如需更复杂的日志格式、字段映射或异步写入,可查阅 Serilog 官网 和各 sink 的详细文档。
在 Serilog 文件日志(File Sink)中,通过 rollingInterval 和日志文件管理策略,可以让日志文件按天滚动,并通过外部工具(如定时任务)定期清理 30 天前的日志文件,但 Serilog 本身不自动删除旧文件,需要你用脚本或第三方工具定期清理。
在 SQL Server Sink 中,Serilog 本身不支持自动清理数据库中过期日志。要实现“只保存1年日志”,通常做法是:
- Serilog 正常写入日志到 SQL Server。
- 通过 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只负责分割日志文件,不会自动删除旧文件。- 需要结合系统定时任务实现日志文件的自动清理。