लॉग डेटा की बड़ी मात्रा से आवश्यक जानकारी निकालने के लिए रेगेक्स के साथ पार्सिंग लॉग एक मूल्यवान तकनीक है। इस पद्धति को नियोजित करके, कोई प्रभावी रूप से पैटर्न, त्रुटियों और अन्य प्रमुख अंतर्दृष्टि की पहचान कर सकता है, अंततः लॉग विश्लेषण को सुव्यवस्थित कर सकता है और सिस्टम प्रदर्शन को बढ़ा सकता है।
बिंदप्लेन ओपी और एक बिंडप्लेन एजेंट (कस्टम ओपन टेलीमेट्री कलेक्टर)
कस्टम पार्सिंग की आवश्यकता वाली एक जटिल लॉग फ़ाइल
रेगेक्स का ज्ञान
लॉग नमूनों का चयन जो सभी संभावित विविधताओं से मेल खाता है।
(वैकल्पिक) एक अच्छा रेगेक्स टेस्टिंग टूल जैसे कि regex101.com
इस पोस्ट में, हम नीचे दिए गए उदाहरणों के समान लॉग प्रविष्टियों की जांच करेंगे। इन प्रविष्टियों को वर्तमान टाइमस्टैम्प वाली फ़ाइल में लिखने के लिए एक स्क्रिप्ट का उपयोग करके, हम रीयल-टाइम डेटा के साथ प्रभावी ढंग से काम कर सकते हैं।
May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[event=success,timestamp=May 01 14:31:11 UTC 2023,source=RankedMultifactorAuthenticationProviderWebflowEventResolver]|AUTHENTICATION_EVENT_TRIGGERED|audit:unknown|172.25.178.6|172.16.156.55 May 01 14:31:11 loggen-app08 test-system[780]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|Supplied credentials: [UsernamePasswordCredential(username=dawsonb, source=null, customFields={})]|AUTHENTICATION_SUCCESS|dawsonb|172.12.154.117|172.16.156.53 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[event=success,timestamp=May 01 14:31:11 UTC 2023,source=RankedMultifactorAuthenticationProviderWebflowEventResolver]|AUTHENTICATION_EVENT_TRIGGERED|audit:unknown|172.25.178.6|172.16.156.55
अब हम ऊपर पहली लॉग प्रविष्टि ले सकते हैं, और इसे उन अनुभागों में विभाजित करना शुरू कर सकते हैं जिन्हें हम पार्स करना चाहते हैं।
सबसे पहले, हम देखेंगे कि हमारे पास दो टाइमस्टैंप हैं:
**May 01 14:31:11** loggen-app10 test-system[712]: **Mon May 01 14:31:11 UTC 2023**|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55
दूसरा टाइमस्टैम्प वह है जिसे हम अपना आधिकारिक टाइमस्टैम्प बनने के लिए संरक्षित करेंगे क्योंकि इसमें अधिक जानकारी है (टाइमज़ोन और वर्ष उपयोगी हैं, जबकि सप्ताह का दिन वास्तव में नहीं है) जिसका उपयोग हम उच्चतम सटीकता प्राप्त करने के लिए कर सकते हैं।
इसे तोड़कर, हम पहले टाइमस्टैम्प से मिलान करने के लिए एक नॉन-कैप्चरिंग पैटर्न लिखेंगे।
^\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s+The caret “^”
लाइन की शुरुआत में एंकर करता है। इसके बाद “ \w{3}
” आता है, जो 3 अक्षरों वाले महीने के संक्षिप्त नाम को दर्शाता है। महीने के बाद, " \s\d{2}\s
" है, जो एक स्थान पर कब्जा करना है; महीने के 2 अंक, 0 पैडेड दिन; और दूसरी जगह। अंत में, हमारे पास “ \d{2}:\d{2}:\d{2}\s+
” – 2-अंकीय घंटे, 2-अंकीय मिनट, 2-अंकीय सेकंड, और 1 या अधिक रिक्त स्थान हैं।
दूसरे टाइमस्टैम्प के लिए, हम एक नामांकित कैप्चर समूह चाहते हैं। यह पार्स किए गए फ़ील्ड के JSON ब्लॉब में एक नामित फ़ील्ड बन जाएगा।
(?P<timestamp>\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}\s\d{4})
हमने इस कैप्चर ग्रुप का नाम "टाइमस्टैम्प" रखा है। इसमें अन्य टाइमस्टैम्प के समान मूल रेगेक्स शामिल है, जिसमें सप्ताह के संक्षिप्त दिन को कैप्चर करने के लिए प्रारंभ में " \w{3}\s
" जोड़ा जाता है, और " \s\w{3}\s\d{4}
"3 वर्ण टाइमज़ोन और 4 अंकों के वर्ष को कैप्चर करने के लिए अंत में" \s+
"की जगह।
लॉग संदेश में आगे बढ़ते हुए, हम होस्टनाम और सिस्टम को पार्स करना चाहेंगे:
May 01 14:31:11 **loggen-app10 test-system[712]**: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55
इस संदेश में, हमारा होस्टनाम **loggen-app10**
है, और हमारा सिस्टम **test-system[712]**
है। मुझे यह नहीं बताया गया था कि [712] क्या था जब मैंने ये लॉग प्राप्त किए। मैंने यह धारणा बना ली है कि यह पीआईडी (प्रक्रिया आईडी) है, लेकिन मैंने इसे अभी के लिए अलग से पार्स नहीं करना चुना है। इन क्षेत्रों को पार्स करना काफी सरल है, और हम समाप्त करते हैं: “ (?P<hostname>[^\s]+)\s+(?P<system>.*?):\s+
”। हमारे पास नामांकित कैप्चर समूह, होस्टनाम और सिस्टम की एक जोड़ी है।
होस्टनाम के लिए पैटर्न " [^\s]+
" है, जो कहता है कि किसी भी गैर-स्पेस कैरेक्टर को कैप्चर करें और उनमें से जितने आप कर सकते हैं (लालची) कैप्चर करें। इसके बाद " \s+
" आता है, जो कम से कम एक, लेकिन जितना संभव हो (फिर से लालची) स्थान (ओं) को कैप्चर करता है।
सिस्टम के लिए कैप्चर ग्रुप और भी आसान है क्योंकि स्पेस के बाद हम सब कुछ एक कोलन कैरेक्टर तक कैप्चर करते हैं। ऐसा करने के लिए, हम " .*?
”। वह पैटर्न क्या कहता है, किसी भी वर्ण को 0 या अधिक बार कैप्चर करें, लेकिन लालची मत बनो।
उसके बाद, हमारे पास बृहदान्त्र चरित्र और अन्य 1 या अधिक रिक्त स्थान लालची हैं। इन्हें कैप्चर नहीं किया गया है, लेकिन इस सेक्शन और हमारे द्वारा ऊपर लिखे गए टाइमस्टैम्प सेक्शन के बीच पैड आउट करने की आवश्यकता है।
इसका परिणाम निम्नलिखित शुरुआती पैटर्न में होता है:
^\w{3}\s*\d{2}\s*\d{2}:\d{2}:\d{2}\s+(?P<hostname>[^\s]+)\s+(?P<system>.*?):\s+(?P<timestamp>\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}\s\d{4})
मैं संपूर्ण पैटर्न निर्माण प्रक्रिया से नहीं गुजरूंगा, लेकिन जैसा कि मैंने ऊपर किया था, मैं इसे जारी रखना चाहता हूं।
परिणामी अंतिम पैटर्न है:
^\w{3}\s*\d{2}\s*\d{2}:\d{2}:\d{2}\s+(?P<hostname>[^\s]+)\s+(?P<system>.*?):\s+(?P<timestamp>\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}\s\d{4})\|(?P<app_name>\w*)\|((?P<message_type>.*?):\s+)?\[?(?P<message>.*)\]?\|(?P<event_message>.*?)\|(?P<username>.*?)\|(?P<external_ip>[\d\.:]*)\|(?P<internal_ip>[\d\.:]*)
इस अंतिम पैटर्न में निम्नलिखित नामांकित कैप्चर समूह शामिल हैं, जो पार्स किए गए डेटा के हमारे JSON ब्लॉब में फ़ील्ड बन जाते हैं:
बाइंडप्लेन में, मैं एक फ़ाइल स्रोत बना देता हूं। यह मेरी जेनरेट की गई लॉग फ़ाइल को /root/complex.log में देखता है। मैंने पार्स प्रारूप के तहत रेगेक्स का चयन किया है। रेगेक्स पैटर्न के तहत, मैंने ऊपर अंतिम पैटर्न डाला। मैंने पार्स टाइमस्टैम्प के लिए बॉक्स को चेक किया है, प्रारूप के लिए मैनुअल चुना है, और अपने टाइमस्टैम्प के पैटर्न के लिए समय पार्सिंग कोड डाल दिया है।
एक बार हो जाने के बाद, ऐसा दिखता है:
परीक्षण पूरा करने के लिए, मुझे एक गंतव्य बनाना होगा और वहां डेटा की जांच करनी होगी। मेरे उपयोग के उदाहरण के लिए, मैंने Google क्लाउड लॉगिंग गंतव्य चुना है।
एक बार मेरी पाइपलाइन कॉन्फ़िगरेशन पूर्ण हो जाने पर, मैं इसे एजेंट से जोड़ता हूं। इसके कुछ पल चलने के बाद, मैं एजेंट के पेज पर "हाल ही का टेलीमेट्री बटन देखें" पर क्लिक करता हूं
टेलीमेट्री व्यू मुझे निम्नलिखित पार्स किए गए लॉग दिखाता है:
अंत में, मैं इसे Google क्लाउड लॉगिंग कंसोल पर भी देखता हूं:
यह एक ही लॉग प्रविष्टि प्रदर्शित करता है, और इसमें हाल ही के टेलीमेट्री दृश्य से हमारे शरीर के JSON मैप ऑब्जेक्ट का JSON पेलोड है।
अगले चरणों के लिए, मैं उस संदेश मान को पार्स करना चाहता हूं। यह अक्सर एक कुंजी/मान सेट होता है; जैसा कि ऊपर स्क्रीनशॉट और नमूने में है। मैं डेटा को आगे एक प्रोसेसर को पास कर सकता हूं जो इन कुंजी/मान प्रविष्टियों को JSON की दूसरी परत में पार्स करता है। उपरोक्त उदाहरण में, body.message
अपने आप में वापस पार्स हो जाएगा, और आपके पास फ़ील्ड हो सकते हैं जैसे:
body.message.result=Service Access Granted body.message.service=https://innosoftfusiongo.com/sso/logi… body.message.principal=SimplePrincipal(id=dawsonb, attributes={mail=[[email protected]], eduPersonAffiliation=[Staff], ou=[Recreation/Student Rec Center], givenName=[Dawson], cn=[Dawson Branden], title=[Asst. Director], employeeNumber=[5000000], o=[Vice ChancellorStudent Affairs], fakeuniOrg=[Vice ChancellorStudent Affairs], casMFARequired=[YES], uid=[dawsonb], eduPersonPrimaryAffiliation=[Staff], fakeuniCid=[5000000], fakeuniSeparationDate=[99991231000000Z], UDC_IDENTIFIER=[dawsonb], sn=[Branden], organizationalStatus=[Staff]}) body.message.requiredAttributes=””
यहां तक कि इसे key/value पार्सर के माध्यम से body.message.principle डालकर आगे भी पार्स किया जा सकता है।
अब, कोई आश्चर्य करने के लिए बाध्य है, "आपने शरीर के रेगेक्स पार्सिंग का उपयोग क्यों नहीं किया। संदेश उपक्षेत्र भी?" उत्तर: यह बहुत असंगत है। रेगेक्स अविश्वसनीय रूप से, और अनुचित रूप से जटिल होगा, जब हमारे पास पहले से ही कुंजी/मूल्य जोड़े को पार्स करने की क्षमता होगी।
लॉग फ़ाइलों में डेटा के कई रूप मिल सकते हैं। इस डेटा को अक्सर मनुष्यों के लिए और अधिक आसानी से पढ़ने योग्य बनाने के लिए पार्स करने की आवश्यकता होती है और बाद में कार्रवाई करने के लिए श्रृंखला में स्वचालन और टूलींग के लिए आसान होता है।
जबकि मैंने जिस उदाहरण के साथ काम किया था, वह एक साधारण फ़ाइल लॉग पर किया गया था, यहाँ की तकनीकों का उपयोग किसी भी लॉग स्ट्रीम पर किया जा सकता है। रेगेक्स पार्सिंग के अलावा, BindPlane JSON ,XML , की/वैल्यू पेयर और कैरेक्टर से अलग किए गए मानों का भी समर्थन करता है। प्रोसेसर के उपयोग के साथ, एम्बेडेड डेटा को पार्स करने के लिए इन पार्सर्स को एक साथ जंजीर में बांधा जा सकता है, और इसे एक प्रयोग करने योग्य प्रारूप में हेरफेर किया जा सकता है।