مراقبة وتسجيل تطبيقات C#: من الفوضى إلى النظام

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا يصرخ تطبيق C# الخاص بك وأنت لا تسمع؟

\n

تخيل: تقوم بتشغيل إصدار جديد من خدمة مصغرة بلغة C# في منتصف الليل. كل شيء يعمل بشكل مثالي... أول 10 دقائق. ثم فجأة! يشتكي المستخدمون من البطء، وأنت تجلس أمام ملف سجل بحجم 2 جيجابايت وتحاول العثور على إبرة في كومة قش. هل هذا مألوف؟ إذا لم يكن كذلك - فأنت إما عبقري أو لم تقم أبدًا بالمراقبة بشكل حقيقي.

\n

في هذه المقالة، سنشرح كيفية تحويل فوضى السجلات إلى نظام منظم. ستتعلم كيفية إعداد تسجيل C# حتى لا تفقد عقلك عند النشر، وكيفية بناء مراقبة التطبيقات التي تساعد حقًا، وليس فقط رسم رسوم بيانية جميلة.

\n\n

من أين نبدأ: فلسفة التسجيل الصحيح

\n

يعتقد العديد من المطورين: "سأضع Console.WriteLine - وهذا يكفي". مفاجأة: لا، ليس كافيًا. التسجيل الحقيقي في C# هو structured logging (التسجيل المنظم). بدلاً من أسطر مثل:

\n
Log.Info("User " + userId + " bought item " + itemId);
\n

تكتب:

\n
Log.Information("User {UserId} bought item {ItemId}", userId, itemId);
\n

الفرق هائل. في الحالة الثانية، يمكنك تصفية السجلات حسب UserId، وبناء لوحات المعلومات، والعثور بسرعة على المشكلات. هذا هو أساس تشخيص أخطاء C# في بيئة الإنتاج.

\n\n

اختيار المكتبة: Serilog vs NLog vs log4net

\n

في سوق .NET هناك ثلاثة لاعبين رئيسيين. دعنا نقارنهم وفقًا لمعايير مهمة للمشروع الحقيقي:

\n
    \n
  • Serilog - المفضل في .NET الحديث. مثالي للتسجيل المنظم، سهل التهيئة، يدعم sinks (الإخراج إلى ملف، قاعدة بيانات، Elasticsearch). أوصي به للمشاريع الجديدة.
  • \n
  • NLog - المخضرم مع تهيئة مرنة عبر XML/JSON. مناسب تمامًا للأنظمة القديمة حيث يُستخدم بالفعل.
  • \n
  • log4net - القديم الذي من الأفضل عدم لمسه إلا للضرورة القصوى. الدعم ضعيف، والتسجيل المنظم يتم عبر حلول مؤقتة.
  • \n
\n

لـ تتبع .NET في التطبيقات الحديثة، Serilog هو الخيار رقم 1. دعنا نهيئه في 5 دقائق.

\n\n

إعداد Serilog في C#: دليل خطوة بخطوة

\n

قم بتثبيت الحزم عبر NuGet:

\n
dotnet 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:

\n
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\n

السجلات المنظمة: كيفية استخراج أقصى فائدة

\n

لنفترض أن لدينا طريقة لمعالجة الطلب. بدون التنظيم، كنت ستكتب:

\n
logger.LogInformation("Processing order {OrderId} for user {UserId}", order.Id, user.Id);
\n

مع Serilog، يتحول هذا إلى كائن JSON يمكن تحليله. وإذا أضفت السياق عبر ILogger<T>:

\n
public class OrderService\n{\n    private readonly ILogger<OrderService> _logger;\n\n    public OrderService(ILogger<OrderService> logger)\n    {\n        _logger = logge                

المدونات

توصيات الكتب