مرکزی مواد پر جائیں
ماڈیول 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+ -- صارف IDs (عام طور پر -)۔
  • \[[^\]]+\] -- مربع بریکٹ میں تاریخ۔
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- اقتباسات میں درخواست، HTTP طریقہ، راستہ اور ورژن کے ساتھ۔
  • (?<status>\d+)\s+(?<size>\d+) -- اسٹیٹس کوڈ اور بائٹس بھیجے گئے۔

عمومی حکمت عملی

  1. اصل لائن سے شروع کریں اور حد بندی کرنے والوں کو پن کریں: خالی جگہیں، کوٹس، بریکٹس۔
  2. حد بندی کرنے والوں کے درمیان، ٹوکن کی قسم کی شناخت کریں (IP، لفظ، نمبر)۔
  3. نام گروپوں میں لپیٹیں صرف وہی جو آپ کو نکالنے کی ضرورت ہے۔

پیچیدہ لاگز کو پارس کرنا

لاگ پارسنگ میں، فیلڈز کو عام طور پر جگہ سے الگ کیا جاتا ہے سوائے اس کے کہ جب ان میں کوٹڈ سٹرنگز یا بریکٹ ہوتے ہوں (جیسے صارف کا ایجنٹ)۔ وائلڈ کارڈ ڈاٹ کے بجائے کریکٹر کلاسز کو خارج کرنا متعدد کالموں کو غلط طریقے سے ضم ہونے سے روکتا ہے۔

اسے آزمائیں

ورزش#regex.m8.l2.e1
کوششیں: 0لوڈ ہو رہا ہے…

IPv4 کو ہر لاگ لائن کے شروع میں بطور نامزد گروپ `ip` نکالیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

^ اور m پرچم کے ساتھ لائن کے آغاز پر اینکر کریں، اور 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 کوششوں کے بعد حل دستیاب ہے۔