2010-10-29 10 views
7

मैं HttpLogFormat में स्ट्रिंग के लिए रेगेक्स पैटर्न मैचर ढूंढ रहा हूं। लॉग haproxy द्वारा उत्पन्न होता है। नीचे इस प्रारूप में एक नमूना स्ट्रिंग है।HttpLog प्रारूप को पार्स करने के लिए Regex पैटर्न

Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1" 

प्रारूप की एक व्याख्या HttpLogFormat पर उपलब्ध है। किसी भी मदद की सराहना की है।

मैं उस पंक्ति में शामिल जानकारी के व्यक्तिगत चोटों को प्राप्त करने का प्रयास कर रहा हूं।

  1. process_name '[' पीआईडी ​​']:'/'server_name client_port
  2. ' [ 'accept_date'] '
  3. frontend_name
  4. backend_name यहाँ क्षेत्र हैं:'
  5. क्लाइंट_ ''
  6. Tq '/' Tw '/' Tc '/' Tr '/' Tt *
  7. status_code
  8. bytes_read
  9. +०१२३५१६४१०६
  10. captured_request_cookie
  11. captured_response_cookie
  12. termination_state
  13. actconn '/' feconn '/' beconn '/' srv_conn '/' पुनः प्रयास करता
  14. srv_queue '/' backend_queue
  15. '{' captured_request_headers * '}'
  16. '{' captured_response_headers * '}'
  17. ' "' http_request '"'
+1

आप इस लाइन से पार्स करने का प्रयास कर रहे हैं? इससे मेल खाना एक बात है, इससे कुछ खास जानकारी प्राप्त करने के लिए यह एक और बात है। – eldarerathis

+0

लेकिन आप लाइन से क्या प्राप्त करना चाहते हैं? – Keng

+1

यह वास्तव में इस बात पर निर्भर करता है कि आप क्या मिलान करना चाहते हैं। सारी जानकारी, या इसका केवल एक हिस्सा? – jordanbtucker

उत्तर

4

Regex:

^(\w+ \d+ \S+) (\S+) (\S+)\[(\d+)\]: (\S+):(\d+) \[(\S+)\] (\S+) (\S+)/(\S+) (\S+) (\S+) (\S+) *(\S+) (\S+) (\S+) (\S+) (\S+) \{([^}]*)\} \{([^}]*)\} "(\S+) ([^"]+) (\S+)" *$ 

परिणाम:

Group 1: Feb 6 12:14:14 
Group 2: localhost 
Group 3: haproxy 
Group 4: 14389 
Group 5: 10.0.1.2 
Group 6: 33317 
Group 7: 06/Feb/2009:12:14:14.655 
Group 8: http-in 
Group 9: static 
Group 10: srv1 
Group 11: 10/0/30/69/109 
Group 12: 200 
Group 13: 2750 
Group 14: - 
Group 15: - 
Group 16: ---- 
Group 17: 1/1/1/1/0 
Group 18: 0/0 
Group 19: 1wt.eu 
Group 20: 
Group 21: GET 
Group 22: /index.html 
Group 23: HTTP/1.1 

मैं जटिल नियमित अभिव्यक्ति लिखने के लिए RegexBuddy का उपयोग करें।

+0

धन्यवाद .. यह बहुत अच्छी तरह से काम किया। कुछ कस्टम परिदृश्यों को संभालने के लिए बस कुछ बदलावों की आवश्यकता है। – Thimmayya

1

यह मिलान करने के लिए एक बहुत ही जटिल स्ट्रिंग की तरह दिखता है। मैं Expresso जैसे टूल का उपयोग करने की सलाह दूंगा। जिस स्ट्रिंग से आप मिलान करने का प्रयास कर रहे हैं उसके साथ शुरू करें, फिर रेगेक्स नोटेशन के साथ इसके टुकड़ों को बदलना शुरू करें।

व्यक्तिगत टुकड़ों को पकड़ने के लिए, समूहबद्ध कोष्ठक का उपयोग करें।

दूसरा विकल्प प्रत्येक टुकड़े के लिए रेगेक्स बनाना होगा जिसे आप पकड़ने की कोशिश कर रहे हैं।

2

Use at your own peril

यह मानता है कि सभी फ़ील्ड कुछ को छोड़कर जिन्हें आपने तारों के साथ चिह्नित किया है (क्या तारांकन का मतलब है)? किसी भी तरह के नेस्टेड ब्रैकेट जैसे स्पष्ट विफलता मामले भी हैं, लेकिन अगर लॉगर उचित रूप से सचेत संदेश प्रिंट करता है, तो मुझे लगता है कि आप ठीक होंगे ...

बेशक, मैं व्यक्तिगत रूप से भी नहीं चाहता इसे बनाए रखने के लिए, लेकिन वहां आपके पास है। यदि आप कर सकते हैं, तो आप इसके बजाय नियमित ओल 'पार्सर लिखने पर विचार करना चाहेंगे।

संपादित करें: इसे सीडब्ल्यू के रूप में चिह्नित करें क्योंकि यह "मुझे आश्चर्य है कि यह कैसे निकल जाएगा" किसी और चीज की तुलना में इसका उत्तर।त्वरित संदर्भ के लिए, यह है कि मैं क्या Rubular में निर्माण समाप्त हो गया है:

^[^[]+\s+(\w+)\[(\d+)\]:([^:]+):(\d+)\s+\[([^\]]+)\]\s+[^\s]+\s+(\w+)\/(\w+)\s+(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d*)\s+(\d+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)\s+(\d+)\/(\d+)\s+\{([^}]*)\}\s\{([^}]*)\}\s+\"([^"]+)\"$ 

मेरी पहली प्रोग्रामिंग भाषा पर्ल था, और यहां तक ​​कि मैं स्वीकार करने के लिए है कि मुझे लगता है कि द्वारा भयभीत कर रहा हूँ तैयार हूँ।

+0

+1 उस बदसूरत चीज़ को बाहर निकालने के लिए! मैं इसे आज़माउंगा और अपडेट करूंगा कि यह कैसा चल रहा है। समाधान के लिए – Thimmayya

+0

धन्यवाद। यह ज्यादातर भाग के लिए ठीक काम करता है। ऊपर माइक का समाधान बेहतर काम करता है और रेगेक्स सरल और अधिक लचीला है। मैंने रेगेक्स को ट्विक करने के लिए रूबुलर का इस्तेमाल किया और यह एक अच्छा उपकरण है। – Thimmayya

0

मुझे नहीं लगता कि regex, यहाँ आपका सबसे अच्छा विकल्प है ... लेकिन अगर यह आपके ही एकमात्र विकल्प है कि ...

इन विकल्पों के बजाय देखने का प्रयास करें। https://serverfault.com/q/62687/438

+0

आप अन्य विकल्प क्या सुझाते हैं? – Thimmayya

+0

@ थिममेय्या मुझे लगता है कि स्प्लंक मेरी सूची के शीर्ष पर होगा। http://www.splunk.com/ – Keng

1

आप मैच लाइन ठीक करने के लिए कोशिश कर रहे हैं क्यों? यदि आप इसमें विशिष्ट फ़ील्ड की तलाश में हैं, तो बेहतर कौन से निर्दिष्ट करें और उन्हें निकालें। यदि आप हैप्रोक्सी लॉग पर आंकड़े चलाने के लिए चाहते हैं, तो आपको स्रोतों में "contrib" निर्देशिका में "हलोजन" टूल पर एक नज़र डालना चाहिए। संस्करण 1.4.9 से एक को लें, यह भी जानता है कि प्रतिक्रिया समय से यूआरएल को कैसे सॉर्ट करें।

लेकिन जो भी आप उन पंक्तियों के साथ करना चाहते हैं, रेगेक्स शायद सबसे धीमा और सबसे जटिल समाधान होगा।

संबंधित मुद्दे