मुख्य सामग्री पर जाएं
मॉड्यूल 8 · पाठ 2 का 4पाठ्यक्रम में 30/32~12 min
मॉड्यूल पाठ (2/4)

अपाचे लॉग पार्सर

अपाचे लॉग (संयुक्त प्रारूप) की एक सटीक संरचना होती है:

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

नामित समूहों वाला एक पैटर्न प्रत्येक फ़ील्ड को एक बार में निकालता है:

Code
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)

यह राक्षसी दिखता है, लेकिन यह सरल पैटर्न का संयोजन है:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- स्रोत IPv4.
  • \s+\S+\s+\S+ -- उपयोगकर्ता आईडी (आमतौर पर -)।
  • \[[^\]]+\] -- वर्गाकार कोष्ठक में तारीख।
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- HTTP विधि, पथ और संस्करण के साथ उद्धरण चिह्नों में अनुरोध।
  • (?<status>\d+)\s+(?<size>\d+) -- स्थिति कोड और बाइट्स भेजे गए।

सामान्य रणनीति

  1. वास्तविक लाइन से शुरू करें और डिलीमीटर को पिन करें: रिक्त स्थान, उद्धरण, कोष्ठक।
  2. सीमांकक के बीच, टोकन के प्रकार (आईपी, शब्द, संख्या) की पहचान करें।
  3. **नामित समूहों में केवल वही लपेटें जो आपको निकालना है।

जटिल लॉग को पार्स करना

लॉग पार्सिंग में, फ़ील्ड को आमतौर पर स्थान-पृथक किया जाता है, सिवाय इसके कि जब उनमें उद्धृत स्ट्रिंग या ब्रैकेट होते हैं (उदाहरण के लिए उपयोगकर्ता-एजेंट)। वाइल्डकार्ड डॉट के बजाय एक्सक्लूडिंग कैरेक्टर क्लासेस का उपयोग करने से कई कॉलमों को गलत तरीके से मर्ज होने से रोका जा सकता है।

इसे अजमाएं

व्यायाम#regex.m8.l2.e1
प्रयास: 0लोड हो रहा है...

प्रत्येक लॉग लाइन की शुरुआत में IPv4 को नामित समूह `ip` के रूप में निकालें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

लाइन की शुरुआत में ^ और एम ध्वज के साथ एंकर करें, और आईपी को (?<ip>...) में लपेटें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#regex.m8.l2.e2
प्रयास: 0लोड हो रहा है...

उद्धरणों के बीच HTTP विधि और अनुरोध के पथ को समूह `metodo` और `path` के रूप में निकालें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

" से खोलें, फिर (?<metodo>\\w+)\\s+(?<path>\\S+).

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#regex.m8.l2.e3
प्रयास: 0लोड हो रहा है...

Extract only the date and time part enclosed in brackets in logs, e.g. `10/Oct/2024:13:55:36 +0000`, as a named group `timestamp`.

संपादक लोड हो रहा है...
संकेत दिखाएँ

Use \[(?<timestamp>[^\]]+)\] to prevent the engine from matching past the closing bracket.

3 प्रयासों के बाद समाधान उपलब्ध है