Rust अनुप्रयोगों में लॉगिंग: व्यवहार में सर्वोत्तम अभ्यास

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Rust अनुप्रयोगों में लॉगिंग: व्यवहार में सर्वोत्तम अभ्यास

\n\n

लॉगिंग किसी भी production-अनुप्रयोग के प्रमुख तत्वों में से एक है। यह त्रुटियों का निदान करने, सिस्टम के व्यवहार को ट्रैक करने और मीट्रिक एकत्र करने में मदद करता है। Rust पारिस्थितिकी तंत्र में इसके लिए कई परिपक्व समाधान मौजूद हैं। इस लेख में हम वास्तविक कोड उदाहरणों के साथ लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे।

\n\n

1. मूल बातें: crate log और फ़ेसड आर्किटेक्चर

\n\n

Rust में डी-फ़ैक्टो मानक crate log है। यह एक अमूर्त फ़ेसड प्रदान करता है, जो किसी विशिष्ट कार्यान्वयन से बंधा नहीं होता है। इसका मतलब है कि आप log मैक्रोज़ के माध्यम से लॉग लिखते हैं, और वास्तव में कौन सा backend उन्हें संसाधित करेगा (कंसोल में आउटपुट, फ़ाइल में, ELK को भेजना) — यह दूसरे crate को जोड़ने के चरण पर तय होता है।

\n\n

बेसिक लॉगिंग सेटअप

\n\n
// Cargo.toml\n[dependencies]\nlog = "0.4"\nenv_logger = "0.11"
\n\n
// main.rs\nuse log::{info, warn, error, debug};\n\nfn main() {\n    // env_logger को इनिशियलाइज़ करें (RUST_LOG वेरिएबल पढ़ता है)\n    env_logger::init();\n\n    info!("एप्लिकेशन शुरू हुआ");\n    warn!("डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग किया जा रहा है");\n    error!("गंभीर त्रुटि: {}", "फ़ाइल नहीं मिली");\n}
\n\n

एप्लिकेशन को एनवायरनमेंट वेरिएबल के साथ चलाएँ:

\n
RUST_LOG=info cargo run
\n\n

स्क्रीन पर आप देखेंगे:

\n
[2025-01-15T10:30:00Z INFO  my_app] एप्लिकेशन शुरू हुआ\n[2025-01-15T10:30:00Z WARN  my_app] डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग किया जा रहा है\n[2025-01-15T10:30:00Z ERROR my_app] गंभीर त्रुटि: फ़ाइल नहीं मिली
\n\n

2. लॉगिंग स्तरों का लचीला कॉन्फ़िगरेशन

\n\n

RUST_LOG वेरिएबल आपको मॉड्यूल और स्तरों के अनुसार संदेशों को लचीले ढंग से फ़िल्टर करने की अनुमति देता है। यह बड़े प्रोजेक्ट्स के लिए महत्वपूर्ण है, जहाँ डीबग लॉग का शोर महत्वपूर्ण घटनाओं को छिपा सकता है।

\n\n

फ़िल्टरिंग के उदाहरण

\n\n
# पूरे एप्लिकेशन से केवल त्रुटियाँ और चेतावनियाँ\nRUST_LOG=warn\n\n# केवल database मॉड्यूल में डीबग, बाकी info\nRUST_LOG=info,my_crate::database=debug\n\n# सभी स्तर, trace सहित\nRUST_LOG=trace
\n\n

व्यवहार में इस दृष्टिकोण का उपयोग करें:

\n
use std::env;\n\nfn setup_logging() {\n    if env::var("RUST_LOG").is_err() {\n        // डेवलपमेंट के लिए डिफ़ॉल्ट मान\n        env::set_var("RUST_LOG", "info,my_crate=debug");\n    }\n    env_logger::init();\n}
\n\n

3. tracing के साथ संरचित लॉगिंग

\n\n

जटिल सिस्टम (माइक्रोसर्विसेज़, एसिंक्रोनस एप्लिकेशन) के लिए tracing crate का उपयोग करना बेहतर है। यह स्पैन (spans) और संरचित फ़ील्ड को सपोर्ट करता है, जो लॉग को रिक्वेस्ट चेन में जोड़ने की अनुमति देता है।

\n\n

log और tracing की तुलना

\n\n
    \n
  • log — सरल, हल्का, छोटे प्रोजेक्ट्स के लिए उपयुक्त।
  • \n
  • tracing — शक्तिशाली, स्पैन, इवेंट, संरचित फ़ील्ड को सपोर्ट करता है; async-कोड और tracing-इंस्ट्रुमेंटेशन वाले सिस्टम के लिए आदर्श।
  • \n
\n\n

tracing और tracing-subscriber के साथ उदाहरण

\n\n
// Cargo.toml\n[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"
\n\n
use tracing::{info, error, span, Level};\nuse tracing_subscriber::FmtSubscriber;\n\n#[tokio::main]\nasync fn main() {\n    // stdout पर आउटपुट के लिए subscriber सेटअप\n    let subscriber = FmtSubscriber::builder()\n        .with_max_level(Level::TRACE)\n        .finish();\n    tracing::subscriber::set_global_default(subscriber)\n        .expect("subscriber सेट करने में विफल");\n\n    // HTTP-रिक्वेस्ट के लिए स्पैन बनाएँ\n    let request_span = span!(Level::INFO, "http_request", method = "GET", path = "/api/users");\n    let _guard = request_span.enter();\n\n    info!("रिक्वेस्ट प्रोसेसिंग शुरू");\n\n    // DB क्वेरी के लिए नेस्टेड स्पैन\n    let db_span = span!(Level::DEBUG, "db_query", query = "SELECT * FROM users");\n    let _db_gu                

ब्लॉग

पुस्तक अनुशंसाएँ