在 .NET 8 中使用 Serilog 和 Seq 进行日志记录
介绍
在本地开发时,我们可以轻松地使用断点和调试功能来检查代码并查看其运行情况。但将应用程序部署到其他环境(例如预发布环境或生产环境)后,就无法做到这一点了。当无法在本地进行调试时,我们可以依赖日志。
日志记录是一种跟踪应用程序运行情况的方法。我们可以编写日志来获取信息,也可以用于追踪应用程序中的错误。
使用 Serilog 进行日志记录
Serilog 是一个简单易用的 .NET 应用程序诊断日志库。它可在所有最新的 .NET 版本上运行,并且可以配置为将日志记录到文件、控制台和其他外部提供程序。
安装和配置 Serilog
我们可以通过命令行或 NuGet 包管理器安装 Serilog。
dotnet add package Serilog

安装完成后,我们可以在应用程序启动时设置 Serilog,通常是在 program.cs 文件中,使用 Serilog.Log 静态类:
using Serilog;
Log.Logger = new LoggerConfiguration()
.CreateLogger();
我们配置的日志记录器目前没有将日志记录到任何位置。要查看日志,我们需要配置日志接收器。让我们来看看什么是日志接收器。
Serilog水槽
Serilog 使用接收器(Sink)将事件记录到外部表示形式。配置 Serilog 时,我们必须指定所需的接收器,否则事件将不会被记录。Serilog 接收器通过 NuGet 分发。可用的接收器示例包括控制台接收器(Console sink),它将日志数据打印到控制台;以及文件接收器(File sink),它将日志事件写入文件。我们还可以通过命令行或 NuGet 包管理器将这些接收器添加到应用程序中。
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("log.txt",
rollingInterval: RollingInterval.Day)
.CreateLogger();
`WriteTo.Console()` 指定将日志事件写入控制台。
要使用 `WriteTo.File()`,我们需要指定日志文件的位置。我们还可以添加一些其他参数,例如 `rollingInterval`。这里,我们指定每天创建一个新的日志文件。
最低水平
Serilog 提供六个日志级别:
详细 (Verbose ):这是日志信息最丰富的级别,会记录所有跟踪事件。生产环境中通常不启用此级别。
调试 (Debug ):此级别用于记录应用程序内部事件,这些事件不一定能从外部观察到。
信息 (Information ):此级别用于记录有关应用程序正常进程的信息。
警告 (Warning ):此级别用于记录有关应用程序正常行为之外的事件的警告。
错误 (Error):此级别用于记录应用程序中功能损坏的事件。此类事件需要立即处理。
致命 (Fatal ):这是最严重的级别。它用于记录可能导致应用程序崩溃的事件。致命事件也需要立即处理。
在配置日志记录器时,我们可以指定要捕获事件的最低级别。
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.File("log.txt",
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true)
.CreateLogger();
如果未指定,Serilog 默认使用 Information 作为最低级别。
我们可以使用 Log 类中与事件级别匹配的方法来编写日志事件。例如,我们可以这样编写一个警告事件:
Log.Warning("Unable to load some services");
在应用程序类中使用日志记录器
在应用程序类中使用日志记录器的最简单方法是通过全局 Log 类。例如:
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
[HttpPost("test-logger")]
public IActionResult TestLogger()
{
Log.Information("This log is from the global Log class");
return Ok();
}
}
当我们运行应用程序并调用测试日志记录器端点时,会在控制台中看到以下内容:
我们还可以通过将日志记录器作为 ILogger 注入到类中来使用它。首先,我们需要将 Serilog 配置为日志记录提供程序。为此,我们需要安装 Serilog.AspNetCore NuGet 包。
dotnet add package Serilog.AspNetCore

注意:Serilog.AspNetCore 依赖于 Serilog 和一些接收器。因此,安装 Serilog.AspNetCore 时,无需安装 Serilog、Serilog.Sinks.Console 和 Serilog.Sinks.File。
安装完该软件包后,我们可以在 program.cs 文件中对应用程序构建器的 Host 对象调用 UseSerilog() 函数,将 Serilog 配置为日志记录提供程序,并传入日志对象:
builder.Host.UseSerilog(Log.Logger);
现在我们可以通过在构造函数中注入 ILogger 接口,在应用程序类中使用日志记录器:
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
private readonly ILogger<TestController> _logger;
public TestController(ILogger<TestController> logger)
{
_logger = logger;
}
[HttpPost("test-logger")]
public IActionResult TestLogger()
{
_logger.Information("This log is from the injected ILogger");
return Ok();
}
}
当我们运行应用程序并调用测试日志记录器端点时,会在控制台中看到以下内容:
将日志写入序列
Seq 是一个自托管的结构化日志搜索和分析服务器。事件以完全结构化的 JSON 数据形式捕获,Seq 可以轻松地使用各种参数进行搜索和筛选。与写入文件相比,这提供了一种更高效的日志访问和分析方式。Seq
可以安装在本地计算机或 Windows/Linux 服务器上。
在本地安装 Seq
您可以从https://datalust.co/download下载 Seq.msi ,并按照默认安装指南将其安装到您的本地计算机上。
安装程序完成文件复制后,您可以选择启动 Seq 服务。这将打开 Seq 服务管理对话框,用于初始设置。系统会提示您提供存储 Seq 数据文件的位置以及托管 Seq 用户界面和 HTTP API 的 URL。您可以保留默认设置。您还可以选择设置管理员用户名和密码。
设置完成后,您可以通过访问默认 URL http://localhost:5341或您配置的 URL 来打开 Seq 用户界面。
现在我们可以配置日志记录器以写入 Seq 了。为此,我们需要安装 Seq sink。
dotnet add package Serilog.Sinks.Seq
现在,我们可以在日志记录器配置中写入 Seq 并提供 Seq URL:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
Log.Information("Starting up application");
让我们再次检查一下序列用户界面,看看我们的信息日志是否出现:
结论
日志记录是我们应用程序的重要组成部分。它可以帮助节省排查生产问题的时间,并在监控过程中提供必要的信息。我们已经了解了如何将 Serilog 日志记录与功能强大的搜索和分析服务器(例如 Seq)结合使用。您可以在这里
获取本教程的示例代码。
要了解更多关于 Serilog 的信息,您可以访问其GitHub 项目的文档。要了解更多关于 Seq 的信息,您可以访问其网站
上的文档。




