تسجيل الأحداث في تطبيقات Rust: أفضل الممارسات والأدوات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يُعد التسجيل (Logging) أمرًا بالغ الأهمية في Rust

التسجيل ليس مجرد تسجيل الأحداث في ملف. في الأنظمة عالية التحميل والآمنة، حيث تجد Rust استخدامها الرئيسي (خوادم الويب، أدوات CLI، الأنظمة المدمجة)، تُعد السجلات المصدر الوحيد للحقيقة عند التصحيح والمراقبة. تقدم Rust نظامًا بيئيًا حيث يمكن أن يؤثر اختيار النهج الصحيح للتسجيل بشكل كبير على الأداء وسهولة صيانة الكود.

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




الأساسيات: كريت log والهندسة الواجهية (Facade Architecture)

في Rust، المعيار الفعلي هو كريت log. فهو يوفر واجهة (تجريدية) لا تعتمد على خلفية (backend) محددة. أنت تكتب الكود باستخدام ماكرو log::info!، log::error!، ويبقى اختيار التنفيذ (أين تكتب: في ملف، وحدة تحكم، syslog) لمستخدم المكتبة.



التثبيت والإعداد الأساسي

أضف إلى Cargo.toml:

[dependencies]log = "0.4"env_logger = "0.11"

env_logger هو الخلفية (backend) الأكثر شيوعًا للإخراج إلى stderr. يتم ضبطه عبر متغير البيئة RUST_LOG.



مثال على تسجيل بسيط

use log::{info, warn, error};

fn main() { env_logger::init();

info!("تم تشغيل التطبيق"); warn!("هذا تحذير"); error!("خطأ حرج: {}", 42);}

قم بتشغيله مع المستوى: RUST_LOG=info cargo run. سترى فقط info وما فوقها. إذا لم يتم تعيين المتغير، فلن يتم عرض السجلات.



مستويات التسجيل

في log تم تعريف 5 مستويات (تصاعديًا حسب الأولوية):

  • trace — معلومات تصحيح مفصلة للغاية (مثل الدخول/الخروج من الدالة).
  • debug — مفيد للمطور أثناء التصحيح.
  • info — أحداث مهمة في عمل التطبيق (بدء التشغيل، الإيقاف، العمليات الناجحة).
  • warn — مواقف قد تكون خطيرة ولكنها لا تعطل العمل.
  • error — أخطاء غير قابلة للإصلاح تتطلب تدخلاً.

نصيحة: في بيئة الإنتاج، استخدم المستوى info أو warn. من الأفضل ترك trace و debug للتطوير.






أفضل الممارسات: كيفية كتابة السجلات بشكل صحيح

مجرد إدراج info!("Something") غير كافٍ. لكي تكون السجلات مفيدة، اتبع هذه القواعد.



1. السجلات المنظمة بدلاً من السلاسل النصية

تجنب دمج السلاسل النصية يدويًا. استخدم الحقول المسماة. في log يتم ذلك من خلال التنسيق:

let user_id = 123;let action = "login";info!("المستخدم {} قام بـ {}", user_id, action);

للتنظيم المتقدم (JSON)، استخدم كريت slog أو tracing.



2. السياق والمعرفات

أضف دائمًا سياقًا: request_id، user_id، session_id. هذا يسمح بربط السجلات في الأنظمة الموزعة.

warn!("خطأ في التحقق",     user_id = user_id,     field = "email",     reason = "تنسيق غير صحيح");


3. تجنب التسجيل في الحلقات الساخنة (Hot Loops)

التسجيل عملية مكلفة (إدخال/إخراج). لا تضع trace! داخل حلقات بملايين التكرارات. استخدم التسجيل الشرطي أو عدادات المقاييس.



4. استخدم RUST_LOG للضبط المرن

يمكنك تصفية السجلات حسب الوحدات (modules) والكريتات:

RUST_LOG="warn,my_crate=debug,othe                

المدونات

توصيات الكتب