تسجيل الأحداث في تطبيقات C#: أفضل الممارسات
تسجيل الأحداث ليس مجرد كتابة رسائل في ملف. في تطبيقات .NET الحديثة، هذه أداة بالغة الأهمية للمراقبة وتصحيح الأخطاء والتدقيق. يسمح تسجيل الأحداث المهيأ بشكل صحيح بالعثور السريع على أسباب الأعطال، وتحليل الأداء وضمان الامتثال لمتطلبات الأمان. في هذه المقالة، سنستعرض أفضل ممارسات تسجيل الأحداث في C# والتي ستساعدك في بناء نظام موثوق لجمع المعلومات التشخيصية.
اختيار مكتبة تسجيل الأحداث: Serilog vs NLog vs ILogger المدمج
في .NET، توجد عدة حلول شائعة. دعنا ننظر في نقاط القوة والضعف لكل منها.
- Microsoft.Extensions.Logging (ILogger) — واجهة مجردة مدمجة. مناسبة للمشاريع البسيطة. لا تدعم التسجيل المنظم "خارج الصندوق".
- Serilog — الرائد من حيث الشعبية. يتميز بسهولة الإعداد، ودعم قوي للسجلات المنظمة، ومجموعة واسعة من sinks (مستقبلات البيانات).
- NLog — إطار عمل ناضج مع تكوين مرن عبر XML أو الكود. مناسب تمامًا للأنظمة القديمة وسيناريوهات التوجيه المعقدة.
للمشاريع الجديدة، يُوصى باستخدام Serilog. فهو يتكامل بسهولة مع ILogger ويوفر API موجز. مثال على التوصيل:
// التثبيت: dotnet add package Serilog.AspNetCoreusing 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(); // استبدال المسجل الافتراضيالاستخدام الصحيح لمستويات تسجيل الأحداث
لا تخلط جميع الرسائل في مستوى واحد. استخدم التدرج التالي:
- Trace (0) — معلومات مفصلة للغاية لتصحيح الأخطاء. تتضمن تفاصيل تنفيذ كل دالة. قم بتشغيلها فقط في بيئة التطوير.
- Debug (1) — بيانات مفيدة للمطور: قيم المتغيرات، نتيجة تنفيذ الدوال.
- Information (2) — أحداث الأعمال: "قام المستخدم بتسجيل الدخول"، "تم إنشاء الطلب". يجب أن تكون مفهومة ليس فقط للمبرمج.
- Warning (3) — حالات شاذة لا توقف العمل: تجاوز وقت التنفيذ، محاولات إعادة الاتصال.
- Error (4) — الاستثناءات والأعطال التي تتطلب تدخلاً. قم دائمًا بتسجيل مكدس الاستدعاءات الكامل.
- Critical (5) — أخطاء قاتلة: فقدان الاتصال بقاعدة البيانات، تجاوز سعة الذاكرة. تتطلب إشعارًا فوريًا.
مثال على التسجيل الصحيح في وحدة التحكم:
[ApiController][Route("api/orders")]public class OrdersController : ControllerBase{ private readonly ILogger<OrdersController> _logger;
public OrdersController(ILogger<OrdersController> logger) { _logger = logger; }
[HttpPost] public IActionResult CreateOrder(OrderDto order) { _logger.LogInformation("إنشاء الطلب {OrderId} للمستخدم {UserId}", order.Id, order.UserId); try { // منطق الأعمال _logger.LogInformation("تم إنشاء الطلب {OrderId} بنجاح", order.Id); return Ok(); } catch (Exception ex) { _logger.LogError(ex, "خطأ أثناء إنشاء الطلب {OrderId}", order.Id); return StatusCode(500); } }}التسجيل المنظم والسياق
تجنب دمج السلاسل النصية في السجلات. بدلاً من Log.Information("User: " + user.Name) استخدم القوالب مع المعاملات:
_logger.LogInformation("المستخدم {UserName} قام بتنفي