لماذا يصرخ تطبيق C# الخاص بك وأنت لا تسمع؟
\nتخيل: تقوم بتشغيل إصدار جديد من خدمة مصغرة بلغة C# في منتصف الليل. كل شيء يعمل بشكل مثالي... أول 10 دقائق. ثم فجأة! يشتكي المستخدمون من البطء، وأنت تجلس أمام ملف سجل بحجم 2 جيجابايت وتحاول العثور على إبرة في كومة قش. هل هذا مألوف؟ إذا لم يكن كذلك - فأنت إما عبقري أو لم تقم أبدًا بالمراقبة بشكل حقيقي.
\nفي هذه المقالة، سنشرح كيفية تحويل فوضى السجلات إلى نظام منظم. ستتعلم كيفية إعداد تسجيل C# حتى لا تفقد عقلك عند النشر، وكيفية بناء مراقبة التطبيقات التي تساعد حقًا، وليس فقط رسم رسوم بيانية جميلة.
\n\nمن أين نبدأ: فلسفة التسجيل الصحيح
\nيعتقد العديد من المطورين: "سأضع Console.WriteLine - وهذا يكفي". مفاجأة: لا، ليس كافيًا. التسجيل الحقيقي في C# هو structured logging (التسجيل المنظم). بدلاً من أسطر مثل:
\nLog.Info("User " + userId + " bought item " + itemId);\nتكتب:
\nLog.Information("User {UserId} bought item {ItemId}", userId, itemId);\nالفرق هائل. في الحالة الثانية، يمكنك تصفية السجلات حسب UserId، وبناء لوحات المعلومات، والعثور بسرعة على المشكلات. هذا هو أساس تشخيص أخطاء C# في بيئة الإنتاج.
اختيار المكتبة: Serilog vs NLog vs log4net
\nفي سوق .NET هناك ثلاثة لاعبين رئيسيين. دعنا نقارنهم وفقًا لمعايير مهمة للمشروع الحقيقي:
\n- \n
- Serilog - المفضل في .NET الحديث. مثالي للتسجيل المنظم، سهل التهيئة، يدعم sinks (الإخراج إلى ملف، قاعدة بيانات، Elasticsearch). أوصي به للمشاريع الجديدة. \n
- NLog - المخضرم مع تهيئة مرنة عبر XML/JSON. مناسب تمامًا للأنظمة القديمة حيث يُستخدم بالفعل. \n
- log4net - القديم الذي من الأفضل عدم لمسه إلا للضرورة القصوى. الدعم ضعيف، والتسجيل المنظم يتم عبر حلول مؤقتة. \n
لـ تتبع .NET في التطبيقات الحديثة، Serilog هو الخيار رقم 1. دعنا نهيئه في 5 دقائق.
\n\nإعداد Serilog في C#: دليل خطوة بخطوة
\nقم بتثبيت الحزم عبر NuGet:
\ndotnet add package Serilog\ndotnet add package Serilog.Sinks.Console\ndotnet add package Serilog.Sinks.File\ndotnet add package Serilog.Sinks.Seq\nالآن - التهيئة الدنيا في Program.cs لـ ASP.NET Core:
using Serilog;\n\nLog.Logger = new LoggerConfiguration()\n .MinimumLevel.Information()\n .WriteTo.Console()\n .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)\n .WriteTo.Seq("http://localhost:5341") // للمراقبة المتقدمة\n .CreateLogger();\n\ntry\n{\n Log.Information("Starting web application");\n var builder = WebApplication.CreateBuilder(args);\n builder.Host.UseSerilog(); // التكامل مع المضيف\n // ... باقي الإعدادات\n var app = builder.Build();\n app.Run();\n}\ncatch (Exception ex)\n{\n Log.Fatal(ex, "Application terminated unexpectedly");\n}\nfinally\n{\n Log.CloseAndFlush();\n}\nلاحظ rollingInterval - سيتم تدوير السجلات يوميًا بدلاً من النمو إلى ما لا نهاية. هذا هو أساس التسجيل غير المتزامن في بيئة الإنتاج.
السجلات المنظمة: كيفية استخراج أقصى فائدة
\nلنفترض أن لدينا طريقة لمعالجة الطلب. بدون التنظيم، كنت ستكتب:
\nlogger.LogInformation("Processing order {OrderId} for user {UserId}", order.Id, user.Id);\nمع Serilog، يتحول هذا إلى كائن JSON يمكن تحليله. وإذا أضفت السياق عبر ILogger<T>:
public class OrderService\n{\n private readonly ILogger<OrderService> _logger;\n\n public OrderService(ILogger<OrderService> logger)\n {\n _logger = logge