Serilog: 功能强大的 .NET 日志库,快速上手与进阶

B站影视 2025-01-23 08:51 2

摘要:Serilog 是一个功能强大的 .NET 日志库,以其简洁的配置和灵活的输出方式而受到开发者喜爱。支持多种日志输出目标(如控制台、文件、数据库等),并且可以通过结构化日志的方式记录丰富的上下文信息,便于后续的日志分析和调试。Serilog 还提供了丰富的扩展

Serilog 是一个功能强大的 .NET 日志库,以其简洁的配置和灵活的输出方式而受到开发者喜爱。支持多种日志输出目标(如控制台、文件、数据库等),并且可以通过结构化日志的方式记录丰富的上下文信息,便于后续的日志分析和调试。Serilog 还提供了丰富的扩展包,能够轻松集成到各种 .NET 应用程序中,帮助开发者高效地管理和记录日志。

第一步,老规矩,安装 NuGet 包。

# 核心库
dotnet add package Serilog

# 控制台输出(可选)
dotnet add package Serilog.Sinks.Console

# 文件输出(可选)
dotnet add package Serilog.Sinks.File

# Elasticsearch 输出(可选)
dotnet add package Serilog.Sinks.Elasticsearch

# Seq 输出(可选)
dotnet add package Serilog.Sinks.Seq2.1 通过代码配置Program.cs文件中配置 Serilog:usingSerilog;

Log.Logger =newLoggerConfiguration
.MinimumLevel.Debug // 设置最低日志级别为 Debug
.WriteTo.Console // 输出到控制台
.WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day) // 输出到文件,按天分割
.CreateLogger;

Log.Information("Serilog 已配置完成。");2.2 通过配置文件配置在文件中配置 Serilog:{
"Serilog":{
"MinimumLevel":"Debug",
"WriteTo":[
{"Name":"Console"},
{
"Name":"File",
"Args":{
"path":"logs/myapp.txt",
"rollingInterval":"Day"
}
}
],
"Overrides":{
"Microsoft":"Warning",
"System":"Error"
}
}
}在Program.cs中加载配置文件:usingSerilog;
usingMicrosoft.Extensions.Configuration;

varconfiguration =newConfigurationBuilder
.AddJsonFile("appsettings.json")
.Build;

Log.Logger =newLoggerConfiguration
.ReadFrom.Configuration(configuration)
.CreateLogger;

Log.Information("Serilog 已配置完成。");

配置完成后,可以在代码中使用 Serilog 记录不同级别的日志:

Log.Information("这是一条信息日志。");
Log.Warning("这是一条警告日志。");
Log.Error("这是一条错误日志。");
Log.Debug("这是一条调试日志。");
Log.Fatal("这是一条致命错误日志。");

Serilog 支持结构化日志,可以通过键值对的形式记录上下文信息:

varuserId =123;
Log.Information("用户 {UserId} 已登录", userId);4.1 日志扩展

通过日志扩展,可以在日志中自动添加额外信息,例如机器名、线程 ID 等:

需要额外的扩展包:

Install-Package Serilog.Enrichers.ThreadInstall-Package Serilog.Enrichers.Environment

Log.Logger = newLoggerConfiguration
.Enrich.WithMachineName
.Enrich.WithThreadId
.WriteTo.Console
.CreateLogger;

还可以自定义富集器,添加应用程序版本信息:

Log.Logger = newLoggerConfiguration
.Enrich.WithProperty("ApplicationVersion",typeof(Program).Assembly.GetName.Version.ToString)
.WriteTo.Console
.CreateLogger;4.2 动态日志级别

根据需要动态调整日志级别:

Log.Logger = newLoggerConfiguration
//对于来自“Microsoft”命名空间的日志,只记录 Warning 及以上级别的日志
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
//对于来自“System”命名空间的日志,只记录 Error 及以上级别的日志
.MinimumLevel.Override("System", LogEventLevel.Error)
.WriteTo.Console
.CreateLogger;4.3 异常捕获和上下文信息

Serilog 可以捕获异常并记录详细的堆栈信息:

try
{
// 模拟一个异常
thrownewInvalidOperationException("这是一个测试异常");
}
catch(Exception ex)
{
Log.Error(ex, "发生了一个异常");
}

也可以在日志中包含更多的上下文信息:

using(LogContext.PushProperty("OperationId", Guid.NewGuid))
{
Log.Information("操作开始");
// 执行一些操作
Log.Information("操作结束");
}5.1 集成 SeqSeq 是一个强大的日志服务器,可以集中管理和可视化日志数据。要集成 Seq,首先需要安装Serilog.Sinks.Seq包:dotnet add package Serilog.Sinks.SeqLog.Logger = newLoggerConfiguration
.WriteTo.Seq("http://seq-server-url")
.CreateLogger;5.2 集成 Elasticsearch安装Serilog.Sinks.Elasticsearch包:dotnet add package Serilog.Sinks.Elasticsearch

然后在配置中添加 Elasticsearch 输出:

Log.Logger = newLoggerConfiguration
.WriteTo.Elasticsearch(newElasticsearchSinkOptions(newUri("http://lasticsearch-url"))
{
AutoRegisterTemplate =true
IndexFormat = "myapp-{0:yyyy.MM.dd}"
})
.CreateLogger;6.1 日志过滤

可以根据条件过滤日志,例如只记录特定源的日志:

Log.Logger = newLoggerConfiguration
.Filter.ByIncludingOnly(Matching.FromSource("MyApp"))
.WriteTo.Console
.CreateLogger;6.2 自定义日志格式

Serilog 允许自定义日志输出格式。例如,使用 JSON 格式输出日志:

Log.Logger = newLoggerConfiguration
.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}")
.WriteTo.File(newJsonFormatter, "logs/myapp.json")
.CreateLogger;6.3 分布式追踪

Serilog 可以与分布式追踪系统(如 Jaeger、Zipkin)集成,帮助跟踪跨服务的请求。例如,使用 OpenTelemetry:

dotnet add package OpenTelemetry.Exporter.Jaeger
dotnet add package Serilog.Enrichers.OpenTelemetry

然后在配置中启用追踪:

Log.Logger = newLoggerConfiguration
.Enrich.WithTraceId
.Enrich.WithSpanId
.WriteTo.Console
.CreateLogger;

Serilog 是一个功能强大且灵活的日志记录库,适用于 .NET 应用程序。通过合理配置和使用不同的日志级别,可以更好地监控应用程序的运行状态,快速定位和解决问题。此外,结合高级功能和最佳实践,可以进一步提升日志记录的效果和效率。

来源:opendotnet

相关推荐