تسجيل الدخول في تطبيقات C#: أفضل الممارسات التطبيقية
تسجيل الدخول ليس مجرد كتابة رسائل في ملف. إنها أداة حيوية للمراقبة وتصحيح الأخطاء والتدقيق لأي تطبيق إنتاجي بلغة C#. يسمح تسجيل الدخول المضبوط بشكل صحيح بالعثور السريع على أسباب الأعطال وتحليل سلوك النظام ومنع الحوادث. في هذه المقالة، سنستعرض أفضل ممارسات تسجيل الدخول في .NET التي يمكنك تطبيقها فوراً في مشاريعك.
1. اختيار المكتبة: Serilog مقابل NLog مقابل ILogger المدمج
في .NET الحديث، هناك ثلاثة طرق رئيسية لتسجيل الدخول. دعنا نستعرض نقاط قوتها.
- ILogger المدمج (Microsoft.Extensions.Logging) — واجهة أساسية مجردة. مدمجة في ASP.NET Core وقابلة للتكوين بشكل بسيط. مناسبة للمشاريع البسيطة، ولكنها تتطلب موفري طرف ثالث للسيناريوهات المتقدمة.
- Serilog — المعيار الفعلي في الصناعة. يدعم التسجيل المنظم "خارج الصندوق"، ونظاماً غنياً من sinks (الوجهات)، وإعداداً بسيطاً عبر التكوين.
- NLog — إطار عمل ناضج مع توجيه مرن ودعم للأنظمة القديمة. يتميز بأداء عالٍ وتفصيل دقيق في إعداد القواعد.
التوصية: للمشاريع الجديدة، استخدم Serilog — فهو يتكامل بشكل أفضل مع الممارسات الحديثة (ELK, Application Insights). للأنظمة عالية التحميل حيث يكون الأداء حاسماً، فكر في NLog.
// مثال على الإعداد الأدنى لـ Serilog في Program.csusing Serilog;
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day) .CreateLogger();
try{ Log.Information("تم تشغيل التطبيق"); // الكود الخاص بك}catch (Exception ex){ Log.Fatal(ex, "خطأ حرج أثناء بدء التشغيل");}finally{ Log.CloseAndFlush();}2. مستويات التسجيل: متى وماذا تكتب
الاختيار الخاطئ لمستوى التسجيل هو أحد أكثر الأخطاء شيوعاً. دعنا نستعرض كل مستوى والغرض منه.
- Trace / Verbose — فقط لتصحيح الأخطاء من قبل المطور. لا تقم بتشغيله في الإنتاج أبداً إلا للضرورة القصوى.
- Debug — معلومات تشخيصية للتطوير. يمكن تشغيله مؤقتاً للبحث عن مشكلة.
- Information — التشغيل العادي للتطبيق: الطلبات، العمليات الناجحة، أحداث الأعمال. المستوى الرئيسي في الإنتاج.
- Warning — مشكلة محتملة: مساحة منخفضة، محاولات متكررة، API قديم.
- Error — الاستثناءات والأعطال التي عالجها التطبيق، لكن المستخدم لاحظ المشكلة.
- Fatal / Critical — أخطاء غير قابلة للاسترداد تتطلب تدخلاً فورياً من المسؤول.
// مثال على الاستخدام الصحيح للمستوياتpublic class OrderService{ private readonly ILogger<OrderService> _logger;
public OrderService(ILogger<OrderService> logger) { _logger = logger; }
public async Task<Order> CreateOrderAsync(CreateOrderRequest request) { _logger.LogInformation("إنشاء طلب للمستخدم {UserId}", request.UserId);
try { var order = await _repository.SaveAsync(request); _logger.LogInformation("تم إنشاء الطلب {OrderId} بنجاح", order.Id); return order; } catch (Exception ex) { _logger.LogError(ex, "خطأ في إنشاء الطلب للمستخدم {UserId}", request.UserId); throw; } }}3. التسجيل المنظم: لماذا هو مهم
التسجيل النصي التقليدي (عبر