使用 Serilog 的 .NET 8 应用程序中的结构化日志记录

作者:微信公众号:【架构师老卢】
3-24 18:46
31

概述:在这篇文章中,我们将了解如何使用 Serilog 库以灵活和现代的方式为应用程序配置结构化日志记录。在我们之前的博客中,我们已经了解了日志记录如何成为应用程序可观测性的重要支柱。有关可观测性的更多信息,请阅读以下博客:在我们深入研究 Serilog 之前,让我们了解什么是结构化日志记录,它与传统的纯文本日志记录有何不同。什么是结构化日志记录?.NET 中的结构化日志记录涉及以比传统纯文本日志记录更有条理且更易于分析的格式记录事件和消息的做法。结构化日志记录不是将消息记录为自由格式文本,而是将日志数据格式化为一组键值对,通常采用 JSON 或键值对等格式。在纯文本记录日志消息中,日志消息将如下图

在这篇文章中,我们将了解如何使用 Serilog 库以灵活和现代的方式为应用程序配置结构化日志记录。在我们之前的博客中,我们已经了解了日志记录如何成为应用程序可观测性的重要支柱。有关可观测性的更多信息,请阅读以下博客:

在我们深入研究 Serilog 之前,让我们了解什么是结构化日志记录,它与传统的纯文本日志记录有何不同。

什么是结构化日志记录?

.NET 中的结构化日志记录涉及以比传统纯文本日志记录更有条理且更易于分析的格式记录事件和消息的做法。结构化日志记录不是将消息记录为自由格式文本,而是将日志数据格式化为一组键值对,通常采用 JSON 或键值对等格式。

在纯文本记录日志消息中,日志消息将如下图所示,它不会提供任何信息,例如日志时间或某些格式,以便我们将来可以搜索。

在我们深入研究结构化日志记录和纯文本日志记录之间的区别之前,让我们添加 Serilog 并查看日志消息将如何修改。要添加 Serilog,请执行以下命令:

dotnet add package Serilog.AspNetCore

在program.cs中添加以下代码行

builder.Services.AddSerilog(options =>  
{  
    options.MinimumLevel.Information()  
           .WriteTo.Console(new JsonFormatter(), LogEventLevel.Debug);  
});

然后,当您使用应用程序时,您将在控制台中看到以下输出。

让我们以一条消息为例,看看 Serilog 如何添加其他详细信息并格式化消息。

{  
  "Timestamp": "2024-03-16T09:21:55.1386236-05:00",  
  "Level": "Information",  
  "MessageTemplate": "Manager created resident with Id: 1",  
  "TraceId": "7ff1a5728b5c34048caa53c0f8af56d8",  
  "SpanId": "cf8de73ceb0fd319",  
  "Properties": {  
    "SourceContext": "ResidentApi.BusinessLogic.Manager.ResidentManager",  
    "ActionId": "ce8f43d2-8a76-4ea3-ad86-ad4cffbe9cf9",  
    "ActionName": "ResidentAPI.Controllers.ResidentController.CreateResident (ResidentAPI)",  
    "RequestId": "0HN25OHE66P2I:00000004",  
    "RequestPath": "/api/Resident",  
    "ConnectionId": "0HN25OHE66P2I"  
  }  
}

正如我们在可观测性中所讨论的,它添加了 TraceId 和 SpanId 以及时间戳。我们可以通过添加更多 Serilog 接收器和更改消息格式来进一步增强输出。现在日志消息已格式化,我们可以轻松地将其发送到 ELK 并搜索它们。我们将在单独的博客中介绍接收器和写入 ELK 和搜索,但现在让我们深入研究纯文本日志记录和结构化日志记录之间的区别。

纯文本日志记录的优势

  • 简单实现 — 纯文本日志记录易于实现。您只需要将日志消息格式化为字符串即可。
  • 熟悉度 — 开发人员通常习惯于编写和阅读纯文本日志消息。
  • 快速调试 — 在开发过程中,可以轻松添加临时日志消息以进行快速调试。
  • 低开销 — 与结构化日志记录相比,生成纯文本日志消息通常会产生较低的性能开销。

纯文本日志记录的缺点

  • 有限的可搜索性 — 日志消息只是字符串,因此很难根据特定条件进行搜索和筛选。您需要解析字符串以提取相关数据。
  • 缺少上下文 — 纯文本日志可能缺少上下文,尤其是在尝试了解特定事件期间应用程序的状态时。
  • 非标准格式 — 每条日志消息可以具有不同的格式,这使得标准化日志分析变得更加困难。

结构测井优势

  • 搜索和筛选 — 由于每个日志事件都是结构化的,因此根据特定属性搜索日志变得更加容易。您可以根据结构化数据中的任何属性筛选日志。
  • 上下文信息 — 结构化日志提供有关记录事件的上下文丰富的信息。您可以包括对象、异常以及与事件相关的其他数据。
  • 可读性 — 结构化格式的日志更易于阅读,尤其是对于开发人员和工具而言。日志条目是自我描述的,可以清楚地说明每条信息所代表的内容。
  • 与工具集成 — 结构化日志与各种日志记录后端和日志分析工具很好地集成。这包括 ELK Stack(Elasticsearch、Logstash、Kibana)、Seq、Splunk 等。
  • 一致性 — 使用结构化日志记录可鼓励在应用程序或系统中保持一致的日志格式。团队成员可以轻松理解和处理来自应用程序不同部分的日志。
  • 灵活性 — 您可以轻松地添加、删除或修改结构化日志中的属性。这种灵活性使开发人员能够根据不断变化的需求调整日志,而无需大量更改日志记录代码。
  • 性能 — 根据日志记录库和配置,结构化日志记录可以提高性能。像 Serilog 这样的库旨在有效地处理结构化数据序列化。

结构日志记录的缺点

  • 复杂性 — 与纯文本日志记录相比,实现结构化日志记录可能需要更多的设置和配置。
  • 学习曲线 — 不熟悉结构化日志记录格式的开发人员可能需要一些时间来习惯使用它们。

在这篇文章中,我们看到了使用 Serilog 进行结构化日志记录和简单设置的优势,在以后的博客中,让我们看看如何设置 Serilog 以写入不同的来源,以及如何使用 Serilog 接收器增强消息,甚至尝试设置 ELK 实例和搜索日志。

相关留言评论
昵称:
邮箱:
阅读排行