在本文中,我们将讨论日志记录的基础知识以及在 .NET Core 6 中使用 Serilog 的逐步实现。
先决条件
日志记录基础知识
从技术角度来说,日志记录是记录事件并捕获应用程序在运行过程中生成的其他信息的过程。它在软件开发的各个方面都发挥着至关重要的作用,包括:
调试-Debugging : 日志为排除错误和识别问题根源提供了有价值的信息。
监控-Monitoring: 日志有助于跟踪应用程序的健康状况、性能和用户活动。
**审计-Auditing:**日志可用于保存特定操作和更改的记录,以达到安全性和合规性目的。
以下是日志记录基础知识的细分:
1. 日志条目:
每个日志条目通常包含以下内容:
时间戳: 表示事件发生的时间。
日志级别: 对事件的严重程度进行分类(例如,调试、信息、警告、错误、严重)。
消息: 详细描述事件。
**上下文信息:**与事件相关的可选数据(例如,用户 ID、请求详细信息)。
2.日志级别:
大多数日志记录框架使用日志级别层次结构,允许您过滤和确定记录信息的优先级:
调试: 深度调试的详细信息(通常在生产中禁用)。
信息: 有关应用程序正常运行的信息消息。
警告: 可能表明存在潜在问题但不一定会导致错误的事件。
错误: 导致应用程序发生故障或遇到意外状态的事件。
**严重:**需要立即关注的事件,可能会导致严重问题。
3. 日志目的地:
日志可以写入各种目的地以用于不同目的:
文件: 存储持久日志以供日后分析的常见选择。
控制台: 对于开发或故障排除期间的实时观察很有用。
数据库: 支持将日志与其他应用程序数据一起存储。
**网络套接字:**允许将日志发送到集中式服务器进行汇总和分析。
4.选择日志框架:
大多数编程语言都有内置的日志库或流行的第三方选项。这些框架提供:
结构化日志: 将日志存储为键值对,以便于分析。
**灵活的 API:**提供各种方法用于不同级别的记录和添加上下文。
.NET Core 中的 Serilog
Serilog 是一个适用于 .NET 应用程序的现代结构化日志记录框架。它提供了一种灵活而强大的方法来捕获和存储日志数据,使开发人员能够轻松地排除故障、监控和分析应用程序行为。
Serilog 对 C# 开发人员有几个好处,包括:
1、配置简单
2、灵活的
3、支持结构化日志记录
什么是 Serilog Sinks?
Serilog 中的接收器是日志目标(即,它们是您想要发送日志的目的地)。一些流行的接收器是文件和控制台目标。Serilog 接收器是您的日志的目的地。这可以是文件、数据库、云服务等。
任何可以存储日志数据的东西都可以用作 Serilog 接收器。Serilog 附带许多内置接收器,但您也可以创建自己的自定义接收器。这样您就可以将日志数据发送到您想要的任何目的地。
步骤1:-
在您的解决方案中安装Serilog.AspNetCore包。此包提供 Serilog 和 ASP.NET Core 之间必要的集成。
步骤2:
Serilog 的配置:在 ASP.NET Core 中配置 Serilog 主要有两种方法:
a)使用appsettings.json:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"rollingInterval": "Day"
}
}
],
"Enrich": [ "FromLogContext" ],
"Properties": {
"Application": "WeatherForecast"
}
}
}
解释:
Using: 在本节中,我们需要指定要使用的接收器类型。(例如:控制台和文件)
Minimum Level: 通过此部分,我们可以设置最低日志级别和信息级别。
WriteTo: 在此部分中,我们可以配置接收器。在此示例中,我们同时使用控制台和文件来写入日志,并进行了一些额外的配置。
Enrich: 使用此部分,我们可以为日志事件添加额外的上下文。
**Properties:**允许我们向日志事件添加自定义属性。
b) 在 Program.cs 中使用 Lambda 表达式:
注意:-(简单来说,当您注入 Serilog 服务时)
public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((context, config) =>
{
config.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.File("log.txt");
});
// Rest of your application configuration code...
}
此方法使用 lambda 表达式来明确配置 Serilog。它将最低日志级别设置为"信息",并将日志写入控制台和名为"log.txt"的文件。
步骤3:
使用应用程序设置配置注册所需的 Serilog 服务并在管道中添加中间件。
注意:-(如果您使用 Lambda 表达式配置 Serilog,请省略此步骤,因为这两者都会在该步骤中出现)
// Add namespace
using Serilog;
// Add serilog services to the container and read config from appsettings
builder.Host.UseSerilog((context, configuration) =>
configuration.ReadFrom.Configuration(context.Configuration));
// Configure Serilog for logging (middleware)
app.UseSerilogRequestLogging();
步骤4:
配置 Serilog 后,您可以将ILogger<T>接口注入到您的类中并使用其方法来记录消息:
注意:- 您也可以使用 Serilog 的方法。我使用的是默认的 ILogger 接口。
public class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.Information("Starting operation...");
// Your code goes here
_logger.Debug("Operation completed successfully.");
}
}
T用您的类别的类型进行替换以获取特定于该类别的记录器。
根据事件的严重性和日志消息详细信息调用适当的日志记录方法(Debug、Information、Warning、Error等)。
附加信息:-
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/.txt",
"rollOnFileSizeLimit": true,
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter,Serilog.Formatting.Compact",
"rollingInterval": "Day",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Properties}{Exception}"
}
}
我们可以添加一些额外的配置,例如:-
rollOnFileSizeLimit是Serilog.Sinks.File接收器中使用的配置选项,用于根据日志文件的大小控制滚动日志文件的行为。以下是其功能的细分:(默认值rollOnFileSizeLimit通常为 1 GB(1073741824 字节)。
1、防止日志文件无限增长,可能导致性能问题或磁盘空间耗尽。
2、一旦当前日志文件达到指定的大小限制:
3、Serilog 会自动创建一个带有递增后缀的新日志文件(例如"log.txt"、"log_00001.txt"、"log_00002.txt"等等)。
rollingInterval是一个选项,定义日志文件滚动的频率(关闭并创建一个新的文件)。
该间隔可以设置为不同的单位,如Hour、Minute、Day等等。
formatter是一个关键组件,它定义如何将日志事件转换为人类可读或机器可读的格式以供存储或显示。Serilog 提供各种内置格式化程序,并支持创建自定义格式化程序以满足您的特定需求。
JsonFormatter
CompactJsonFormatter
RenderedCompactJsonFormatter
Literate Formatter
Exception Formatter
outputTemplate是一个强大的配置选项,可让您定义日志消息的确切结构和内容。它本质上是一个字符串格式模板,类似于字符串插值中使用的模板,但专门针对 Serilog 量身定制。
占位符:
1、@{propertyName}:指日志事件中定义的特定属性。
2、内置属性:无需使用@符号即可使用(例如,Timestamp,Level,Message,Exception)。
3、自定义属性:使用类似方法添加到您的日志事件中Log.Information("Processed {Count} items", count)。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。