تسجيل السجلات في C#: أفضل الممارسات للمطورين المبتدئين

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

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

ابدأ الدورة

مقدمة: لماذا يعتبر تسجيل السجلات أساس التطبيق المستقر



أي مطور، وخاصة المبتدئ، عاجلاً أم آجلاً يواجه موقفاً يتعطل فيه التطبيق ولا يمكن فهم السبب. بدون سجلات، أنت أعمى. تسجيل السجلات ليس مجرد كتابة رسائل إلى ملف، بل هو أداة قوية للمراقبة وتصحيح الأخطاء وتحليل سلوك البرنامج. في بيئة C# (.NET) توجد عدة أطر عمل ناضجة تتيح ضبط مخرجات السجلات بمرونة. في هذه المقالة، سنستعرض أفضل ممارسات تسجيل السجلات للمبتدئين: من اختيار المكتبة إلى الإخراج المنظم للبيانات.



1. اختيار مكتبة التسجيل: NLog مقابل Serilog



لتطبيقات .NET، يوجد لاعبان رئيسيان: NLog و Serilog. كلاهما مجانيان، ويتم صيانتهما بنشاط، ولهما آلاف التكاملات. أيهما تختار؟



NLog

  • سهولة الإعداد عبر XML أو الكود.
  • أداء ممتاز تحت الأحمال العالية.
  • دعم مدمج لتدوير الملفات، وإرسال البريد الإلكتروني، والكتابة في قاعدة البيانات.
  • مناسب للمشاريع التي تحتاج إلى بداية سريعة دون تبعيات إضافية.


Serilog

  • التركيز على التسجيل المنظم (structured logging).
  • يتم تخزين السجلات ليس كسلاسل نصية، بل ككائنات ذات حقول - مما يبسط البحث والتحليل.
  • مثالي للخدمات المصغرة والأنظمة التي تُجمع فيها السجلات في Elasticsearch أو Grafana.
  • بناء الجملة مع العناصر النائبة {Property} يجعل الكود أكثر قابلية للقراءة.


نصيحة للمبتدئين: ابدأ مع Serilog إذا كنت تخطط للعمل مع أدوات المراقبة الحديثة. إذا كان المشروع صغيراً ومحلياً - فإن NLog سيكون مناسباً.



// مثال على إعداد Serilog في Program.cs (.NET 6+)using Serilog;

Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day) .CreateLogger();

var builder = WebApplication.CreateBuilder(args);builder.Host.UseSerilog(); // ربط Serilog بالمضيف


2. مستويات التسجيل: متى وماذا تكتب



من أكثر الأخطاء شيوعاً للمبتدئين هو كتابة كل شيء في مستوى Info أو Error. هذا يلوث السجلات ويجعلها عديمة الفائدة. في .NET، المستويات المعتمدة هي (حسب الأهمية تصاعدياً):



  • Trace - أدق التفاصيل: الدخول/الخروج من الدوال، تكرار الحلقات. يُستخدم فقط أثناء التصحيح العميق.
  • Debug - معلومات تصحيح للمطور: قيم المتغيرات، حالة الكائنات.
  • Information - الأحداث الرئيسية لعمل التطبيق: بدء التشغيل، الإيقاف، معالجة ناجحة لطلب.
  • Warning - مشاكل محتملة لا تعطل العمل: طلب بطيء، إصدار قديم من API.
  • Error - الاستثناءات والأعطال التي تتطلب تدخلاً: خطأ في قاعدة البيانات، انتهاء المهلة.
  • Fatal - أخطاء حرجة لا يمكن بعدها للتطبيق مواصلة العمل.


// مثال على استخدام مستويات مختلفةILogger<MyService> _logger;

public async Task ProcessOrderAsync(int orderId){ _logger.LogInformation("بدء معالجة الطلب {OrderId}", orderId);

try { var result = await _repository.GetOrderAsync(orderId); if (result == null) { _logger.LogWarning("الطلب {OrderId} غير موجود", orderId); return; } // ... المنطق } catch (Exception ex) { _logger.LogError(ex, "خطأ أثناء معالجة الطلب {OrderId}", orderId); throw; // إعادة رمي الاستثناء للأعلى إذا لم يكن بالإمكان التعافي }}


أفضل ممارس

المدونات

توصيات الكتب