Serilog 是一个功能强大的 .NET 日志库,支持结构化日志记录,适用于控制台、文件、数据库等多种存储方式。以下是 Serilog 的基本使用方法:
1. 安装 Serilog
在 .NET Core 或 .NET 7/8 项目中,使用 NuGet 安装 Serilog 及相关 Sink(日志存储目标)。
dotnet add package Serilog
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File
如果要用于 ASP.NET Core,还需要安装 Serilog.AspNetCore:
dotnet add package Serilog.AspNetCore
2. 在 Console 应用程序中使用 Serilog
在 Program.cs
进行 Serilog 配置并写入日志:
using Serilog;
class Program
{
static void Main(string[] args)
{
// 配置 Serilog
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug() // 设置日志级别
.WriteTo.Console() // 输出到控制台
.WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day) // 按天滚动日志
.CreateLogger();
Log.Information("应用程序启动");
Log.Warning("这是一个警告信息");
Log.Error("发生错误: {ErrorCode}", 404);
Log.CloseAndFlush(); // 关闭日志
}
}
日志输出示例
[10:30:45 INF] 应用程序启动
[10:30:46 WRN] 这是一个警告信息
[10:30:47 ERR] 发生错误: 404
3. 在 ASP.NET Core 中使用 Serilog
(1)修改 Program.cs
在 ASP.NET Core 中集成 Serilog,可以替代默认的 ILogger
,修改 Program.cs
:
using Serilog;
var builder = WebApplication.CreateBuilder(args);
// 配置 Serilog
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.File("logs/webapp.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Host.UseSerilog(); // 替换默认日志
var app = builder.Build();
app.UseSerilogRequestLogging(); // 记录 HTTP 请求
app.MapGet("/", () =>
{
Log.Information("访问首页");
return "Hello, Serilog!";
});
app.Run();
(2)日志文件示例
[10:35:00 INF] HTTP GET / responded 200 in 10.3 ms
[10:35:02 INF] 访问首页
4. 结构化日志
Serilog 支持结构化日志,可以使用 占位符 {}
记录参数信息,而不是简单字符串拼接。
int userId = 123;
string action = "Login";
Log.Information("用户 {UserId} 执行了 {Action} 操作", userId, action);
日志输出:
[10:40:00 INF] 用户 123 执行了 Login 操作
这样可以让日志系统更容易解析,而不是单纯的文本格式。
5. 使用 JSON 配置 Serilog
可以使用 appsettings.json 进行配置,首先安装依赖包:
dotnet add package Serilog.Settings.Configuration
dotnet add package Microsoft.Extensions.Configuration.Json
然后,在 appsettings.json
添加 Serilog 配置:
{
"Serilog": {
"MinimumLevel": "Debug",
"WriteTo": [
{ "Name": "Console" },
{ "Name": "File", "Args": { "path": "logs/log.json", "rollingInterval": "Day" } }
],
"Enrich": ["FromLogContext", "WithMachineName"]
}
}
然后在 Program.cs
中加载配置:
using Microsoft.Extensions.Configuration;
using Serilog;
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.CreateLogger();
6. 输出到 Elasticsearch 或数据库
Serilog 还支持输出到 Elasticsearch、SQL Server、MongoDB 等数据库。例如,使用 Elasticsearch:
dotnet add package Serilog.Sinks.Elasticsearch
然后配置 LoggerConfiguration
:
.WriteTo.Elasticsearch(new Serilog.Sinks.Elasticsearch.ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
{
AutoRegisterTemplate = true
})
7. 使用 ILogger 注入
在 ASP.NET Core 中,可以通过 ILogger<T>
进行依赖注入:
using Microsoft.Extensions.Logging;
public class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public void DoWork()
{
_logger.LogInformation("MyService is working.");
}
}
在 Program.cs
中注册服务:
builder.Services.AddSingleton<MyService>();
然后在控制器或服务中使用:
var service = app.Services.GetRequiredService<MyService>();
service.DoWork();
总结
- 安装 Serilog,可以用于 Console、File、Elasticsearch 等多种 Sink。
- 控制台应用中使用
Log.Logger
进行日志记录。 - ASP.NET Core 使用 Serilog 替换默认日志系统,并可使用 JSON 进行配置。
- 支持结构化日志,使用
{}
占位符格式化日志。 - 支持日志持久化到数据库(如 Elasticsearch、SQL Server 等)。
- 可通过
ILogger<T>
进行依赖注入,更符合 ASP.NET Core 规范。