admin管理员组

文章数量:1446760

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

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

1. 安装

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

代码语言:javascript代码运行次数:0运行复制
# 核心库
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.Seq
2. 配置

Serilog 的配置可以通过代码或配置文件完成。

2.1 通过代码配置

Program.cs 文件中配置 Serilog:

代码语言:javascript代码运行次数:0运行复制
using Serilog;

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

Log.Information("Serilog 已配置完成。");
2.2 通过配置文件配置

appsettings.json 文件中配置 Serilog:

代码语言:javascript代码运行次数:0运行复制
{
  "Serilog":{
    "MinimumLevel":"Debug",
    "WriteTo":[
      {"Name":"Console"},
      {
        "Name":"File",
        "Args":{
          "path":"logs/myapp.txt",
          "rollingInterval":"Day"
        }
      }
    ],
    "Overrides":{
      "Microsoft":"Warning",
      "System":"Error"
    }
}
}

Program.cs 中加载配置文件:

代码语言:javascript代码运行次数:0运行复制
using Serilog;
using Microsoft.Extensions.Configuration;

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

Log.Information("Serilog 已配置完成。");
3. 使用 Serilog 记录日志

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

代码语言:javascript代码运行次数:0运行复制
Log.Information("这是一条信息日志。");
Log.Warning("这是一条警告日志。");
Log.Error("这是一条错误日志。");
Log.Debug("这是一条调试日志。");
Log.Fatal("这是一条致命错误日志。");

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

代码语言:javascript代码运行次数:0运行复制
var userId = 123;
Log.Information("用户 {UserId} 已登录", userId);
4. 高级功能
4.1 日志扩展

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

需要额外的扩展包:

Install-Package Serilog.Enrichers.Thread Install-Package Serilog.Enrichers.Environment

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .Enrich.WithMachineName()
    .Enrich.WithThreadId()
    .WriteTo.Console()
    .CreateLogger();

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

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .Enrich.WithProperty("ApplicationVersion", typeof(Program).Assembly.GetName().Version.ToString())
    .WriteTo.Console()
    .CreateLogger();
4.2 动态日志级别

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

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    //对于来自“Microsoft”命名空间的日志,只记录 Warning 及以上级别的日志
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    //对于来自“System”命名空间的日志,只记录 Error 及以上级别的日志
    .MinimumLevel.Override("System", LogEventLevel.Error)
    .WriteTo.Console()
    .CreateLogger();
4.3 异常捕获和上下文信息

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

代码语言:javascript代码运行次数:0运行复制
try
{
    // 模拟一个异常
    throw new InvalidOperationException("这是一个测试异常");
}
catch (Exception ex)
{
    Log.Error(ex, "发生了一个异常");
}

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

代码语言:javascript代码运行次数:0运行复制
using (LogContext.PushProperty("OperationId", Guid.NewGuid()))
{
    Log.Information("操作开始");
    // 执行一些操作
    Log.Information("操作结束");
}
5. 最佳实践:集成 Seq 或 Elasticsearch
  • 使用结构化日志:尽量使用结构化日志记录上下文信息。
  • 合理设置日志级别:避免在生产环境中记录过多的调试信息。
  • 定期清理日志:使用文件滚动机制,防止日志文件过大。
  • 集中管理日志:将日志集中到日志管理工具(如 Seq、Elasticsearch)。
5.1 集成 Seq

Seq 是一个强大的日志服务器,可以集中管理和可视化日志数据。要集成 Seq,首先需要安装 Serilog.Sinks.Seq 包:

代码语言:javascript代码运行次数:0运行复制
dotnet add package Serilog.Sinks.Seq

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

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .WriteTo.Seq("http://seq-server-url")
    .CreateLogger();
5.2 集成 Elasticsearch

安装 Serilog.Sinks.Elasticsearch 包:

代码语言:javascript代码运行次数:0运行复制
dotnet add package Serilog.Sinks.Elasticsearch

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

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://lasticsearch-url"))
    {
        AutoRegisterTemplate = true,
        IndexFormat = "myapp-{0:yyyy.MM.dd}"
    })
    .CreateLogger();
6. 进阶技巧
6.1 日志过滤

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

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .Filter.ByIncludingOnly(Matching.FromSource("MyApp"))
    .WriteTo.Console()
    .CreateLogger();
6.2 自定义日志格式

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

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}")
    .WriteTo.File(new JsonFormatter(), "logs/myapp.json")
    .CreateLogger();
6.3 分布式追踪

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

代码语言:javascript代码运行次数:0运行复制
dotnet add package OpenTelemetry.Exporter.Jaeger
dotnet add package Serilog.Enrichers.OpenTelemetry

然后在配置中启用追踪:

代码语言:javascript代码运行次数:0运行复制
Log.Logger = new LoggerConfiguration()
    .Enrich.WithTraceId()
    .Enrich.WithSpanId()
    .WriteTo.Console()
    .CreateLogger();
7. 总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-13,如有侵权请联系 cloudcommunity@tencent 删除异常serilog开发者配置日志

本文标签: Serilog 功能强大的 NET 日志库快速上手与进阶