在现代软件开发中,日志不仅是调试问题的重要工具,更是系统可观测性的核心组成部分。传统的日志通常以纯文本形式输出,难以被机器解析和分析。而C#日志结构化输出则通过将日志信息组织为结构化的数据(如 JSON),极大提升了日志的可读性、可搜索性和自动化处理能力。
本教程将手把手教你如何在 C# 项目中使用 Serilog 实现结构化日志记录,即使你是编程小白也能轻松上手!
传统日志示例:
User John logged in at 2024-06-01 10:30:00 from IP 192.168.1.100 结构化日志示例(JSON 格式):
{ "Timestamp": "2024-06-01T10:30:00Z", "Level": "Information", "MessageTemplate": "User {UserName} logged in from IP {IpAddress}", "Properties": { "UserName": "John", "IpAddress": "192.168.1.100" }} 可以看到,结构化日志将关键信息提取为字段(如 UserName、IpAddress),便于后续用 ELK(Elasticsearch, Logstash, Kibana)或 Seq 等工具进行分析。
Serilog 是 .NET 生态中最流行的日志框架之一,它原生支持结构化日志记录,语法简洁,扩展性强,并且与 ASP.NET Core 深度集成。此外,它支持多种输出目标(控制台、文件、数据库、云服务等)。
打开 Visual Studio 或使用 .NET CLI 创建一个新项目:
dotnet new console -n StructuredLoggingDemocd StructuredLoggingDemo 然后安装 Serilog 及其控制台输出插件:
dotnet add package Serilogdotnet add package Serilog.Sinks.Console 修改 Program.cs 文件如下:
using Serilog;// 配置 SerilogLog.Logger = new LoggerConfiguration() .WriteTo.Console( outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}") .CreateLogger();try{ Log.Information("Application starting..."); // 模拟用户登录事件 string userName = "Alice"; string ipAddress = "10.0.0.5"; // 使用结构化日志:将变量作为命名参数传入 Log.Information("User {UserName} logged in from IP {IpAddress}", userName, ipAddress); Log.Information("Application shutdown.");}catch (Exception ex){ Log.Fatal(ex, "Application terminated unexpectedly");}finally{ Log.CloseAndFlush();} 运行程序后,你将在控制台看到类似这样的输出:
2024-06-01 10:35:00 [INF] Application starting...2024-06-01 10:35:00 [INF] User Alice logged in from IP 10.0.0.52024-06-01 10:35:00 [INF] Application shutdown. 但这还不是真正的结构化输出(仍是文本)。要输出 JSON 格式,我们需要使用 CompactJsonFormatter。
首先安装 JSON 格式化包:
dotnet add package Serilog.Formatting.Compact 然后修改配置,使用 CompactJsonFormatter:
using Serilog;using Serilog.Formatting.Compact;Log.Logger = new LoggerConfiguration() .WriteTo.Console(new CompactJsonFormatter()) .CreateLogger();// 后续日志代码不变Log.Information("User {UserName} logged in from IP {IpAddress}", "Bob", "172.16.0.20");Log.CloseAndFlush(); 现在运行程序,你会看到每条日志都是一行完整的 JSON:
{"@t":"2024-06-01T10:40:00.0000000Z","@m":"User Bob logged in from IP 172.16.0.20","@i":"a1b2c3d4","UserName":"Bob","IpAddress":"172.16.0.20"} 这种格式非常适合被日志收集系统(如 Fluentd、Logstash)解析,从而实现强大的日志分析功能。
Serilog 还支持直接记录复杂对象:
var user = new { Id = 1001, Name = "Carol", Role = "Admin" };Log.Information("Processing user {@User}", user); // 注意 @ 符号! 使用 {@User}(带 @)会将整个对象序列化为 JSON;若用 {User}(不带 @),则只调用 ToString()。
通过本教程,你已经掌握了在 C# 中实现日志格式化和结构化日志记录的核心方法。使用 Serilog 不仅能提升开发效率,还能为系统运维和监控打下坚实基础。
记住这几个关键点:
{UserName})代替字符串拼接{@Object} 记录完整对象结构CompactJsonFormatter 输出机器可读的日志C# Serilog教程 中的最佳实践现在,你可以将这些知识应用到你的实际项目中,构建更可观测、更易维护的 C# 应用程序!
本文由主机测评网于2025-12-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251212405.html