مفهوم السجلات و التعامل معها في جافا

ينقطع اتصال الطائرة مع برج الملاحة وتتحرى السلطات مكانها لتجدها متحطمة وقد نجى بعض الركاب عدا قائد الطائرة، تبدأ السلطات بالبحث عن الصندوق الأسود الذي يحتوي على تسجيل شامل لكل نشاط حدث في الطائرة كصوت قائد الطائرة و كل ما قام به من بداية الرحلة إلى لحظة تحطم الطائرة كي يتوصلوا للسبب الذي أدى إلى ذلك.

لك أن تتخيل الآن أهمية هذا الصندوق فمن خلاله يمكن معرفة الأخطاء التي حدثت ومحاولة تجنبها في الرحلات الجوية التالية، القصة السابقة تمثل أحد أهم أسباب تسجيل كل البيانات المهمة والتي قد تدلنا على سبب وقوع الكارثة، وتسمى هذه التسجيلات في عالم البرمجة بالسجلات (Logs).

السجلات هي ملفات يتم تخزين البيانات والأحداث فيها أثناء تشغيل البرنامج، وتكون مفيدة عندما نريد تتبع وقت حدوث بعض الأحداث و تحمل أهمية كبيرة في تحديد أسباب وقوع المشاكل أثناء استخدام البرنامج إذ أننا لا نمتلك في تلك البيئة جميع الصلاحيات التي تمكننا من معرفة المشكلة و سببها كما في بيئة التطوير، و تختلف البيانات التي يتم تخزينها في السجلات بحسب حاجتنا لها، و هذه أمثلة على بعض ما يتم تخزينه:

  • الإستثناءات: فمثلاً عندما يتم إطلاق إستثناء (Exception) في البرنامج يجب علينا تخزين البيانات المتعلقة به و التي تتضمن سبب الإستثناء، الملف و السطر الذي أطلق بسببه، الثريد (Thread) الذي كان يشغّل الكود و تسلسل تنيفذ الدوال (StackTrace).
  • الأحداث غير الطبيعية: مثل أن تحاول عرض الصورة الشخصية للمستخدم لكن البرنامج لا يجدها رغم أن المستخدم لم يقم بحذفها.
  • الأحداث التي تريد تتبعها: مثل أن تقوم بتسجيل دخول أحد المسؤولين في موقعك عبر IP معين في وقت معين أو تسجيل قيامه بحذف مسؤولين آخرين أو حذف بيانات معينة، و هذه الأحداث إن لم يتم تسجيلها قد لا يُعرف فاعلها.

 

كيف تقوم بتسجيل السجلات

تتوفر الآن الكثير من المكتبات المشهورة والتي لا تكاد تفارق أي مشروع برمجي لتسهيل كتابة السجلات، و تقوم بمساعدتك على تسجيل السجلات بطريقة منظمة سهلة الضبط والإعداد وتوفر لك الكثير من الخيارات، ومن أشهر المكتبات في لغة جافا هي Log4J و Slf4J.

يمكنك طباعة السجلات مباشرة في موجه الأوامر (Console) باستخدام الأمر System.out.print على سبيل المثال و لكن لا يفضل إستخدامه أبداً في عملية تسجيل السجلات لكون هذه الطريقة غير مرنة و قد تضطر في المستقبل لإستبدالها بأحد المكتبات التي ذكرناها سابقاً مع الإشارة إلى أننا سنستخدم مكتبة Log4J في شرحنا كي نتعرف على بعض النصائح في كتابة السجلات.

 

كيف تعمل Log4J

تمتلك Log4J كلاس إسمه LogManager يستخدم لإدارة المسجلات Loggers، و يقوم هذا الكلاس بإنشاء المسجلات (Loggers) و إعدادها والإحتفاظ بها قبل إستخدامها، ويتم تمييز كل مسجل (Logger) عن الآخر بإسم مميز، فمثلاً يمكنك إنشاء مسجل بالإسم GUI أو UsersEvents حسب البيانات التي تريد تسجيلها بإستخدامه، ويمتلك كل مسجل إعدادات خاصة به تصف أين و كيف و ماذا سيسجل بالضبط كما هو موضح في الصورة.

كما ترى في الصورة نقوم بتمرير البيانات التي نريد تسجيلها للمسجل، و يقوم المسجل حينها بتحديد إن كان سيقوم بتسجيلها أم لا، إن كان يريد تسجيلها سيقوم بتمرير البيانات للـAppender، ومهمته هي كتابة البيانات إلى مكان معين يمكننا تحديده، لكن كيف سيقوم بكتابة البيانات؟ يجب على المستخدم تحديد كيف سيقوم بكتابة البيانات من خلال كائن يسمى Layout حيث يقوم هذا الأحير بأخذ البيانات و تنسيقها مثل كتابة التاريخ و الوقت و بيانات أخرى كثيرة و تحويلها لنص (String) يمكن قراءته بسهولة،

توفر Log4J الكثير من الـLayouts الجاهزة للإستخدام منها:

  • JsonLayout الذي يقوم بحفظ البيانات على شكل صيغة JSON.
  • HtmlLayout الذي يقوم بحفظ البيانات على شكل جدول HTML مما يسهل عرض البيانات على المتصفح.
  • PatternLayout الذي يسمح لك بكتابة النمط الذي سيتم تسجيل البيانات به.
  • XMLLayout الذي يقوم بحفظ البيانات على شكل XML.

بعد ذلك يقوم الـAppender بكتابة هذا النص في المكان الذي يجب حفظ السجلات فيه،

توفر Log4J الكثير من الـAppenders الجاهزة للإستخدام مثل:

  • ConsoleAppender الذي يقوم بكتابة السجلات في موجه الأوامر.
  • FileAppender الذي يقوم بكتابة السجلات في ملف وهو الذي يستخدم بالعادة.
  • JDBCAppender الذي يقوم بكتابة السجلات في قاعدة بيانات (وهو أمر غير مفضل بالعادة).
  • SocketAppender الذي يقوم بكتابة السجلات إلى Socket، و يكون مناسباً في بعض الحالات مثل إرتباط الجهاز الذي يتم تشغيل البرنامج عليه بخادم رئيسي.
  • HttpAppender الذي يقوم بإرسال طلبات Http تحمل السجلات.

 

ما الذي يجب تسجيله

تختلف الأمور التي قد تحتاج لكتابتها في السجل بإختلاف مكان تشغيل البرنامج و حالته، فمثلاً قد تحتاج لتسجيل تحذير لحدث غير متوقع لكن برنامجك تدارك الموضوع أو قد تحتاج لتسجيل إستثناء منع برنامجك من عمل شيء معين أو قد تحتاج لتسجيل إستثناء قاتل (Fatal) يؤدي إلى إيقاف برنامجك عن العمل، فمن هنا نعرف أن للأحداث المسجلة مستويات (Levels) متفاوتة بالأهمية،

توفر المكتبات إمكانية تحديد مستوى البيانات المسجلة، و سنعرض هنا المستويات التي توفرها Log4J مرتبة حسب قوتها:

  • Trace: يستخدم لتسجيل ماذا يفعل البرنامج بالضبط بغرض فهم كيف تحدث المشاكل أثناء تطوير البرنامج، و يتم تسجيل أغلب العمليات التي حدثت بها.
  • Debug: يستخدم لتسجيل البيانات بغرض إكتشاف الأخطاء و تتبعها.
  • Info: يستخدم لتسجيل الأحداث الطبيعية المهمة في البرنامج التي يسببها المستخدم بشكل مباشر أو يقوم بها النظام وحده، كأن يقوم بتسجيل دخول المستخدم.
  • Warn: يستخدم لتسجيل الأحداث التي قد تتحول لأخطاء في المستقبل مثل اقتراب إمتلاء قاعدة البيانات.
  • Error: يستخدم لتسجيل الأخطاء و الإستثناءات (Exception) التي تحدث و التي يتداركها البرنامج من خلال catch كما في هذا المثال:
Logger logger = LogManager.getLogger("IO");
	  try{
	  FileReader reader = new FileReader(“data.txt”);
	  }catch(FileNotFoundException ex){
	  logger.error(“The file data.txt was not found”، ex);
	  }
  • Fatal: تستخدم لتسجيل الأخطاء التي لا يمكن تداركها وتوقف البرنامج عن العمل بشكل كلي.

عندما تقوم بإعداد المسجل يمكنك تحديد المستوى الذي تريد التسجيل به و سيقوم المسجل بتسجيل كل البيانات التي تحمل ذلك المستوى أو أي مستوى أعلى، فمثلاً إن قمنا بتحديد المستوى Warn سيقوم المسجل بتسجيل جميع السجلات التي من المستوى Warn، Error أو Fatal، و يختلف المستوى الذي يجب أن تحدده باختلاف مكان  و حالة البرنامج فمثلاً عندما يستخدم المستخدم البرنامج يجب أن تضع المستوى Warn ليتم كتابة البيانات المهمة فقط و عندما تكون على علم بوجود خطأ لكنك لا تعرف كيف أو لماذا يحدث يمكنك إختيار مستويات أقل كي يكتب المسجل المعلومات التي تساعدك على إكتشاف المشكلة.

 

أين يجب تسجيل السجلات

في العادة يتم تسجيل السجلات في ملفات تصاحب البرنامج، و يتم إزالة السجلات القديمة في حال امتلاء المساحة المخصصة للسجلات، و لكن في حالات معينة تفضل بعض الشركات الإحتفاظ بالسجلات على المدى الطويل عندما يتم تسجيل بيانات مهمة فيها، و قد تستخدم السجلات أيضا في عملية التنقيب عن البيانات و استخراجها و تحويلها لمعلومات يمكن الإستفادة منها، و يجب الإنتباه لكون السجلات التي تكتبها المواقع الإلكترونية بيانات حساسة لا يجب لأحد الاطلاع عليها من زوار الموقع و يجب منع الوصول المباشر لها لأنها توضح المشاكل التي تحدث في الموقع و تسهل على المخترق إيجاد الثغرات، و يجب عليك عدم تسجيل البيانات الحساسة التي تخص المستخدمين مثل كلمات السر أو معرف الجلسة (Session ID) لأن وصول أي شخص لهذه البيانات يسمح له بالدخول لحسابات المستخدمين الآخرين.

تعليقات