在这篇文章中,我们将了解如何使用 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 和搜索,但现在让我们深入研究纯文本日志记录和结构化日志记录之间的区别。
在这篇文章中,我们看到了使用 Serilog 进行结构化日志记录和简单设置的优势,在以后的博客中,让我们看看如何设置 Serilog 以写入不同的来源,以及如何使用 Serilog 接收器增强消息,甚至尝试设置 ELK 实例和搜索日志。