مقدمة: لماذا نحتاج إلى تسجيل الأحداث في C++؟
\n\nتسجيل الأحداث (التدوين) هو عملية تسجيل الأحداث التي تحدث في البرنامج أثناء تنفيذه. بالنسبة لمطوري C++ المبتدئين، قد يبدو أن إخراج الأخطاء إلى وحدة التحكم باستخدام std::cout كافٍ. ومع ذلك، في المشاريع الحقيقية، يعد تسجيل الأحداث المناسب أداة بالغة الأهمية لتصحيح الأخطاء والمراقبة وتحليل أداء التطبيق.
بدون نظام تسجيل الأحداث، فإنك تخاطر بـ:
\n- \n
- تفويت أخطاء نادرة يصعب إعادة إنتاجها \n
- صعوبة تشخيص المشكلات في بيئة الإنتاج \n
- إنشاء كود غير قابل للقراءة مع
std::coutمبعثرة \n - فقدان معلومات حول تسلسل الأحداث عند حدوث عطل \n
في هذه المقالة، سنستعرض أفضل ممارسات تسجيل الأحداث في C++ للمبتدئين: من اختيار المكتبة إلى ضبط الأداء.
\n\nالمكتبات الأساسية لتسجيل الأحداث في C++
\n\nلماذا لا يجب كتابة مسجل الأحداث الخاص بك؟
\nيحاول العديد من المبتدئين كتابة فئة خاصة بهم لتسجيل الأحداث. هذا خطأ: المكتبات الجاهزة تحل بالفعل مشاكل الأداء، وأمان الخيوط، وتدوير الملفات، والتنسيق المرن. دعنا نستعرض خيارين شائعين.
\n\n1. spdlog — خيار سريع وحديث
\nspdlog هي مكتبة header-only (لا تتطلب تجميعًا)، وتعتبر واحدة من أسرع المكتبات في C++. وهي تدعم التسجيل غير المتزامن، وتنسيقات إخراج متعددة (JSON، النسب المئوية، الألوان في وحدة التحكم)، وإعدادًا بسيطًا.
مثال على الاستخدام الأساسي:
\n#include <spdlog/spdlog.h>\n#include <spdlog/sinks/basic_file_sink.h>\n\nint main() {\n // إنشاء مسجل أحداث يكتب إلى ملف\n auto logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");\n spdlog::set_default_logger(logger);\n \n // مستويات تسجيل الأحداث\n spdlog::info("تم تشغيل التطبيق");\n spdlog::warn("مستوى ذاكرة منخفض: {}%", 15);\n spdlog::error("خطأ في الاتصال بقاعدة البيانات");\n \n // تسجيل الأحداث مع سياق\n spdlog::debug("المستخدم {} قام بتنفيذ الإجراء {}", "admin", 42);\n \n return 0;\n}\n\n2. Boost.Log — للمشاريع المؤسسية
\nإذا كنت تستخدم Boost بالفعل في مشروعك، فإن Boost.Log هو خيار ممتاز. يوفر أقصى مرونة: تصفية حسب المستويات، مستقبلات متعددة (ملف، وحدة تحكم، syslog)، ودعم السمات المخصصة.
مثال على الإعداد:
\n#include <boost/log/trivial.hpp>\n#include <boost/log/utility/setup/file.hpp>\n\nnamespace logging = boost::log;\n\nint main() {\n // إضافة مستقبل ملف\n logging::add_file_log("logs/boost.log");\n \n BOOST_LOG_TRIVIAL(trace) << "رسالة تتبع";\n BOOST_LOG_TRIVIAL(info) << "رسالة معلوماتية";\n BOOST_LOG_TRIVIAL(error) << "خطأ حرج";\n \n return 0;\n}\n\nنصيحة للمبتدئين: ابدأ بـ spdlog — فهو أسهل في التثبيت (فقط انسخ ملفات الرأس) وله توثيق ممتاز.
مستويات تسجيل الأحداث: متى تستخدم ماذا
\nالاستخدام الصحيح للمستويات هو أساس السجل القابل للقراءة. في C++، المستويات التالية مقبولة (من الأكثر تفصيلاً إلى الأكثر حرجًا):
\n\n- \n
- TRACE — تتبع مفصل للغاية (دخول/خروج الدوال، قيم المتغيرات). استخدمه فقط أثناء تصحيح الأخطاء. \n
- DEBUG — معلومات تصحيح الأخطاء التي تساعد المطور (حالة الكائنات، نتائج الحسابات الوسيطة). \n
- INFO — أحداث مهمة في عمل التطبيق (بدء التشغيل، الإيقاف، معالجة ناجحة لطلب). \n
- WARN — مشكلات محتملة لا تعطل العمل (انخفاض سعة الذاكرة، API قديم). \n
- ERROR — أخطاء تتطلب تدخلاً، لكن التطبيق