在开发 C# 应用程序时,日志记录是调试、监控和维护系统的重要手段。然而,在高并发或高频操作场景下,如果对每一条操作都记录日志,不仅会占用大量磁盘空间,还可能影响系统性能。这时,C#日志采样就显得尤为重要。
本文将手把手教你如何在 C# 项目中配置日志的采样输出,让你既能保留关键日志信息,又能有效控制日志量,实现C#日志优化。
日志采样是指在满足特定条件时才记录日志,而不是对所有事件都记录。例如:每100次请求只记录1次日志,或者只记录错误级别以上的日志。
目前主流的 .NET 日志框架如 Microsoft.Extensions.Logging、Serilog 和 NLog 都支持不同程度的采样功能。本文以 Serilog 为例进行演示,因其采样功能强大且易于配置。
首先,你需要安装 Serilog 及其相关扩展包。在你的项目根目录打开终端,执行以下命令:
dotnet add package Serilogdotnet add package Serilog.Sinks.Consoledotnet add package Serilog.Expressions 在 Program.cs 中初始化 Serilog:
using Serilog;var builder = WebApplication.CreateBuilder(args);// 配置 SerilogLog.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger();builder.Host.UseSerilog();var app = builder.Build();app.Run(); Serilog 本身不直接提供“每N条采样1条”的功能,但我们可以通过自定义过滤器或结合 Serilog.Expressions 实现基于概率的采样。
下面是一个简单的随机采样示例(例如:10% 的日志被记录):
using Serilog;using Serilog.Events;using System.Security.Cryptography;var builder = WebApplication.CreateBuilder(args);Log.Logger = new LoggerConfiguration() .Filter.ByExcluding(e => { // 只对 Information 级别以下的日志进行采样 if (e.Level > LogEventLevel.Information) return false; // 生成一个 0-99 的随机数 var randomNumber = RandomNumberGenerator.GetInt32(0, 100); // 如果大于等于 10,则丢弃(即只保留 10%) return randomNumber >= 10; }) .WriteTo.Console() .CreateLogger();builder.Host.UseSerilog();var app = builder.Build();// 示例日志app.MapGet("/test", () =>{ Log.Information("这是一个测试日志"); return "OK";});app.Run(); 这样配置后,只有约 10% 的 Information 级别日志会被输出,而 Warning、Error 等高级别日志则全部保留,确保关键问题不会被遗漏。
在生产环境中,你可能希望根据请求路径、用户ID 或其他上下文信息进行智能采样。Serilog 支持通过 enricher 添加上下文属性,再配合表达式过滤:
.Filter.ByExcluding(Serilog.Expressions.Expression.WithTemplate( "@Level = 'Information' and RequestPath like '/api/health%' and random() > 0.05")) 这种方式可以实现“对健康检查接口只采样 5%”等精细化控制。
通过合理的日志配置教程学习,你可以轻松在 C# 项目中实现采样输出日志,既节省资源又不影响问题排查。记住:不是所有日志都值得记录,关键在于“精准”和“高效”。
希望这篇关于 C#日志采样 的入门指南能帮助你优化日志系统。如果你觉得有用,欢迎分享给更多开发者!
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124467.html