日志记录是软件开发中那些看似并不那么激动人心的事情之一——直到出现问题时。这时你才会意识到,结构合理的日志可以节省数小时的调试和挫败感。在.NET中,日志记录变得更为灵活和强大,特别是利用了微软内置的日志框架。再加上我最喜欢的Serilog,你就可以得到一个既实用又贴心的日志记录方案。
这里是如何开始在.NET中进行日志记录的指南,一些最佳做法,以及为何应集成Serilog以获得最佳日志记录体验。
为什么日志记录很重要?
日志记录就像为未来的你(或你的团队)留下踪迹,当出现问题时,你可以循着这些踪迹追踪。它有以下帮助:就像在迷宫中丢下小面包屑做标记一样。
- 故障排除: 快速定位问题发生的地点。
- 监控: 了解应用在生产环境中的表现。
- 审计: 记录重要事件或交易,确保可追溯。
- 性能分析: 通过计时关键操作来发现性能瓶颈。
好的日志记录习惯可以将“这东西不好用!”转变为“啊哈,我知道这是怎么回事了!”
为什么不用微软自带的日志记录工具呢?
.NET 内置的日志记录框架非常灵活多用。它可以与多种日志提供程序无缝集成,比如控制台、文件或外部服务等,如 Serilog、NLog 或 Application Insights。
几个关键好处:
- 易用性: 内置即可上手 — 开始时无需额外的库。
- 可扩展性: 可以接入像 Serilog 这样的高级日志框架。
- 标准化: 单一的 API 简化了您的应用程序中的代码和培训。
现在,我们来举个例子。
在控制台应用程序中开始记录日志:首先,使用 .NET 9 创建一个新的控制台应用。我们将使用 Microsoft.Extensions.Hosting
和 Microsoft.Extensions.DependencyInjection
来设置我们的应用。如果你还不熟悉 HostApplicationBuilder
,可以参考 Microsoft 的文档 获取快速入门。
using Microsoft.Extensions.Hosting; // 使用Microsoft.Extensions.Hosting;
// 定义一个builder变量...
var builder = Host.CreateApplicationBuilder(args);
// 添加托管服务
builder.Services.AddHostedService<MyCustomHostedService>();
// 构建应用程序
var app = builder.Build();
// 等待应用程序异步运行
await app.RunAsync();
第2步:添加托管
托管服务是演示日志记录实际效果的理想方式。添加一个名为 MyCustomHostedService
的服务。
using Microsoft.Extensions.Hosting;
/// <summary>
/// 自定义的服务宿主类,实现了IHostedService接口。
/// </summary>
public class MyCustomHostedService : IHostedService
{
/// <summary>
/// 开始异步方法,用于启动服务。
/// </summary>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>返回Task.CompletedTask,表示任务已完成。</returns>
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
/// <summary>
/// 停止异步方法,用于停止服务。
/// </summary>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>返回Task.CompletedTask,表示任务已完成。</returns>
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
为服务添加日志记录
现在来给 MyCustomHostedService
加个日志吧。
将类定义为部分类,并在主构造器中注入 ILogger。
public partial class MyCustomHostedService(ILogger<MyCustomHostedService> logger) : IHostedService
{
}
步骤 4:添加一个静态部分日志类:
为了整理日志消息,请使用 LoggerMessage
属性来。这样源代码生成器就可以在构建时生成高效的日志代码。
private static partial class Log
{
[LoggerMessage(EventId = 1, Level = LogLevel.Information,
Message = "启动了 MyCustomHostedService")]
public static partial void StartingMyCustomHostedService(ILogger logger);
[LoggerMessage(EventId = 2, Level = LogLevel.Information,
Message = "停止了 MyCustomHostedService")]
public static partial void StoppingMyCustomHostedService(ILogger logger);
}
步骤 5:记录日志信息
服务启动和停止时的这些日志信息。
public Task StartAsync(CancellationToken cancellationToken)
{
Log.启动自定义托管服务(logger, this);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Log.停止自定义托管服务(logger, this);
return Task.CompletedTask;
}
异常日志记录
异常确实会发生,你的日志应该有助于诊断这些异常。在 StartAsync
方法里添加异常日志。
public Task StartAsync(CancellationToken cancellationToken)
{
try
{
// 启动MyCustomHostedService异步方法
Log.启动MyCustomHostedService(_logger);
throw new Exception("启动MyCustomHostedService时发生错误");
}
catch (Exception ex)
{
Log.启动MyCustomHostedService时出错(_logger, ex);
throw;
}
}
在错误日志中记录消息:
[LoggerMessage(EventId = 3, Level = LogLevel.Error,
Message = "启动 MyCustomHostedService 时出错")]
public static partial void ErrorStartingMyCustomHostedService(ILogger logger,
Exception exception)
定义一个可以重用的日志消息的全局静态类:
public static partial class 全局日志记录
{
[LoggerMessage(EventId = 1, Level = LogLevel.Information,
Message = "消息内容为全局日志消息")]
public static partial void 记录全局日志消息(ILogger logger);
}
你可以在应用程序的任何地方使用它。
结尾啦日志记录是任何健壮应用程序的基石。借助 .NET 内置的日志框架和少许 Serilog,您可以轻松创建一个易于维护、可扩展且有效的解决方案。记住,优秀的日志可以减少麻烦并更快地解决问题。未来的你会感激现在的自己。
你可以在下一个项目中试试看。别忘了记录你的进度哦!
附注:我在我的 Blazor 博客文章中也利用了这个日志机制。想不想看看实际效果?从这里开始吧:
现代网页托管中的冒险
这是一张图片,点击这里可以跳转到链接: 图片链接
共同學習,寫下你的評論
評論加載中...
作者其他優質文章