تسجيل السجلات لـ C++: أفضل الحلول
تسجيل السجلات هو مكون بالغ الأهمية لأي مشروع C++ جاد. فهو يساعد في تتبع تنفيذ البرنامج، والعثور على الأخطاء، وتحليل الأداء، وتدقيق إجراءات المستخدمين. على عكس Python، حيث الوحدة المدمجة logging هي المعيار الفعلي، لا يوجد في C++ حل مدمج واحد. ومع ذلك، أنشأ المجتمع العديد من المكتبات القوية والمرنة. في هذه المقالة، سنستعرض أفضلها: spdlog، Google glog، Boost.Log و Easylogging++.
معايير اختيار مكتبة تسجيل السجلات
قبل الانتقال إلى المراجعة، من المهم فهم ما يجب الانتباه إليه عند الاختيار:
- الأداء: تأثير ضئيل على سرعة تشغيل التطبيق.
- المرونة: إمكانية تخصيص التنسيقات، مستويات التسجيل (DEBUG، INFO، WARN، ERROR) والمخرجات (ملف، وحدة تحكم، syslog).
- سهولة التكامل: المكتبات header-only مفضلة للمشاريع الصغيرة.
- دعم تعدد المهام: أمان الخيوط والكتابة غير المتزامنة.
- الترخيص: التوافق مع المشاريع التجارية (MIT، Apache، Boost).
1. spdlog — الأسرع والأكثر حداثة
spdlog هي مكتبة header-only (قابلة للتجميع اختيارياً)، مكتوبة بلغة C++11/14/17. وتعتبر بحق الأكثر شعبية بفضل سرعتها الفائقة واستهلاكها الضئيل للذاكرة. تدعم spdlog التسجيل غير المتزامن، وهو أمر مهم بشكل خاص للأنظمة عالية التحميل.
الإمكانيات الرئيسية:
- أمان الخيوط خارج الصندوق.
- العديد من المخرجات (sinks): ملفية، وحدة تحكم، syslog، ملفات دوارة، ملفات يومية.
- دعم المنسقات المخصصة (بناءً على fmtlib).
- وضع غير متزامن مع قائمة انتظار للرسائل.
- تسجيل شرطي.
مثال استخدام:
#include "spdlog/spdlog.h"#include "spdlog/sinks/basic_file_sink.h"
int main() { // إنشاء مسجل يكتب إلى ملف auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/app.log"); spdlog::set_default_logger(file_logger); spdlog::set_level(spdlog::level::debug);
// تسجيل الرسائل spdlog::info("تم تشغيل التطبيق"); spdlog::warn("تم اكتشاف سلوك مشبوه: {}", 42); spdlog::error("خطأ حرج: {}", errno);
// تسجيل غير متزامن spdlog::flush_every(std::chrono::seconds(3)); return 0;}متى تختار: للمشاريع الحديثة حيث السرعة حرجة. مثالية للألعاب، والخوادم في الوقت الفعلي، والأنظمة المدمجة.
2. Google glog — معيار مجرب عبر الزمن
Google glog (مكتبة تسجيل Google) هي مكتبة طورتها Google للاحتياجات الداخلية. إنها بسيطة وموثوقة وتستخدم في آلاف المشاريع حول العالم. لا تحاول glog أن تكون الأسرع، لكنها توفر جميع الوظائف الضرورية لتسجيل السجلات في بيئة الإنتاج.
الميزات:
- تدوير تلقائي للسجلات حسب الحجم.
- مستويات التسجيل: INFO، WARNING، ERROR، FATAL (مع abort).
- تسجيل شرطي (LOG_IF، LOG_EVERY_N).
- دعم تتبع الاستدعاءات عند الأخطاء الفادحة.
- تبعيات ضئيلة — فقط pthreads.
مثال استخدام:
#include <glog/logging.h>
int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); FLAGS_log_dir = "./logs"; FLAGS_minloglevel = google::INFO;
LOG(INFO) << "تم تشغيل الخادم على المنفذ " << 8080; LOG(WARNING) <