تسجيل الدخول لـ Rust: أفضل الحلول
تسجيل الدخول هو مكون بالغ الأهمية لأي تطبيق جاد في Rust. فهو يساعد في تتبع تنفيذ الكود، اكتشاف الأخطاء، مراقبة الأداء وتحليل سلوك النظام في بيئة الإنتاج. في هذه المقالة، سنستعرض المكتبات الرئيسية لتسجيل الدخول في نظام Rust البيئي، ميزاتها، فوائدها وأمثلة على استخدامها.
لماذا يعتبر تسجيل الدخول مهمًا في Rust؟
باعتبار Rust لغة نظامية، فإنها تفرض متطلبات عالية من الموثوقية والقابلية للتنبؤ. يتيح تسجيل الدخول:
- تتبع تدفق التنفيذ في التطبيقات متعددة الخيوط.
- تسجيل الحالات غير المتوقعة وحالات الذعر (panics).
- إجراء تدقيق أمني.
- جمع المقاييس لتحسين الأداء.
المكتبات الرئيسية لتسجيل الدخول
1. log — واجهة تسجيل الدخول
log هي واجهة قياسية (طبقة مجردة) لتسجيل الدخول في Rust. تحدد وحدات الماكرو info!، warn!، error!، debug!، trace! و trait Log. هي بحد ذاتها لا تُخرج السجلات — بل تحتاج إلى خلفية (مثل env_logger أو slog).
// Cargo.toml[dependencies]log = "0.4"
// main.rsuse log::{info, warn, error};
fn main() { // تهيئة الخلفية إلزامية env_logger::init(); info!("تم تشغيل التطبيق"); warn!("مستوى ذاكرة منخفض: {}%", 15); error!("خطأ حرج: {}", "فشل الاتصال");}2. env_logger — خلفية بسيطة وسريعة
env_logger هي الخلفية الأكثر شيوعًا لـ log. يتم تكوينها عبر متغير البيئة RUST_LOG. تدعم التصفية حسب الوحدات والمستويات.
// التثبيت// cargo add env_logger
// مثال على التكوينuse log::LevelFilter;
fn main() { env_logger::Builder::from_env( env_logger::Env::default().default_filter_or("info") ).init();
log::info!("تشغيل بمستوى INFO"); log::debug!("لن يتم عرض هذه الرسالة");}
// التشغيل مع المتغير:// RUST_LOG=debug cargo run3. slog — تسجيل الدخول المنظم
slog هي مكتبة قوية لتسجيل الدخول المنظم. تدعم المفتاح-القيمة، سلاسل المسجلات، الكتابة غير المتزامنة والسائقين المخصصين. مثالية للأنظمة المعقدة حيث يكون السياق مهمًا.
// Cargo.toml[dependencies]slog = "2.7"slog-term = "2.9"slog-json = "2.6"
// main.rsuse slog::{o, Drain, Logger, info};
fn main() { let decorator = slog_term::TermDecorator::new().build(); let drain = slog_term::FullFormat::new(decorator).build().fuse(); let drain = slog_async::Async::new(drain).build().fuse();
let logger = Logger::root(drain, o!("version" => "1.0"));
info!(logger, "تم تشغيل الخادم"; "port" => 8080, "env" => "production");}4. tracing — الأدوات والتتبع
tracing هي مكتبة حديثة من فريق Tokio، مصممة لتسجيل الدخول المنظم والتتبع. تسمح بإنشاء spans (فترات زمنية بسياق)، وهو أمر لا غنى عنه للتطبيقات غير المتزامنة ومتعددة الخيوط.
// Cargo.toml[dependencies]tracing = "0.1"tracing-subscriber = "0.3"
// main.rsuse tracing::{info, span, Level};use tracing_subscriber::fmt;
fn main() { // تهيئة المشترك fmt::init();
let span = span!(Level::INFO, "main", "app" = "my_service"); let _guard = span.enter();
info!("معالجة الطلب"); // السجلات داخل الـ span تحتوي تلقائيًا على السياق}مقارنة المكتبات
- log + env_logger: البساطة، الحد الأدنى، مناسب للمشاريع الصغيرة