2014-04-08 9 views
24

के साथ JSON का उपयोग करके मैं यहां अपने दिमाग से बाहर जा रहा हूं। मेरे पास एक ऐप है जो फ़ाइल को लॉग लिखता है। प्रत्येक लॉग प्रविष्टि एक JSON ऑब्जेक्ट है। मेरी .json फ़ाइल का एक उदाहरण निम्नलिखित की तरह दिखता है:लॉगस्टैश

{"Property 1":"value A","Property 2":"value B"} 
{"Property 1":"value x","Property 2":"value y"} 

मैं LogStash में लॉग प्रविष्टियों पाने के लिए सख्त कोशिश कर रहा हूँ।

input { 
    file { 
    type => "json" 
    path => "/logs/mylogs.log" 
    codec => "json" 
    } 
} 
output { 
    file { 
    path => "/logs/out.log" 
    } 
} 

अभी, मैं मैन्युअल रूप से कोशिश करते हैं और काम कर इसे पाने के लिए mylogs.log को रिकॉर्ड जोड़ रहा: यह करने के लिए की कोशिश में, मैं निम्नलिखित LogStash विन्यास फाइल बना लिया है। हालांकि, वे stdout में विचित्र रूप से दिखाई देते हैं। जब मैं खुले out.log देखो, मैं निम्नलिखित की तरह कुछ देखें:

{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","host":"ip-[myAddress]","path":"/logs/mylogs.log"} 
इस वजह से

, अगर मैं ElasticSearch को संदेश भेजते हैं, मैं खेतों नहीं मिलता है। इसके बजाय मुझे एक झुका हुआ गड़बड़ मिलती है। मुझे अभी भी गुणों के लिए मेरी संपत्तियों की आवश्यकता है। मैं नहीं चाहता कि वे संदेश भाग या आउटपुट में फंस गए हों। मेरे पास एक झुकाव है जिसमें कोडेक्स के साथ कुछ करना है। फिर भी, मुझे यकीन नहीं है। मुझे यकीन नहीं है कि मुझे लॉगस्टैश इनपुट कॉन्फ़िगरेशन पर कोडेक बदलना चाहिए या नहीं। या, अगर मुझे आउटपुट कॉन्फ़िगरेशन पर इनपुट बदलना चाहिए। मैं किसी भी मदद की ईमानदारी से सराहना करता हूं क्योंकि मैं इस बिंदु पर हताश हो रहा हूं।

धन्यवाद।

उत्तर

30

json codec को दूर करने और एक json filter

input { 
    file { 
    type => "json" 
    path => "/logs/mylogs.log" 
    } 
} 
filter{ 
    json{ 
     source => "message" 
    } 
} 
output { 
    file { 
    path => "/logs/out.log" 
    } 
} 

जोड़ने आप json कोडेक की जरूरत नहीं है क्योंकि आप स्रोत JSON डिकोड नहीं करना चाहती प्रयास करें, लेकिन आप इनपुट को फ़िल्टर @message में JSON डेटा प्राप्त करना चाहते हैं केवल क्षेत्र

उम्मीद है कि इससे मदद मिलती है।

+1

मीठा संदेश तरह निरर्थक क्षेत्र को दूर कर सकते हैं! वह काम किया। इसके अलावा, इससे मुझे अपने वास्तविक JSON को प्राप्त करने में मदद नहीं मिली :(। मैं आपको जवाब के लिए क्रेडिट दूंगा। मैंने http://stackoverflow.com/questions/22944168/json-variants-log4j- पर एक माध्यमिक प्रश्न खोला साथ-लॉगस्टैश – user70192

+0

ग्रेट! मैं बाद में एक नज़र डालेगा। चीयर्स। – vzamanillo

+1

हाय! मैंने इस लॉगस्टैश कॉन्फ़िगरेशन फ़ाइल 'इनपुट {tcp {port =>' 9563 '}} फ़िल्टर {json {source => "message"}} आउटपुट का उपयोग किया {elasticsearch {hosts => ["localhost: 9200"]}} 'लेकिन फिर भी लोचदार खोज में मेरा जेसन संदेश क्षेत्र में एक स्ट्रिंग के रूप में रखा गया है _ _message: "{\" कंटेनर \ ": \" दस्तावेज़ \ ", \ "msg \": \ "अजगर से 26 oct \"} "' _। मैं किबाना में अलग-अलग क्षेत्र के रूप में _'container'_ और _'msg'_ प्राप्त करने में असमर्थ हूं। मेरे पास किबाना में यह अतिरिक्त क्षेत्र है _tags: _jsonparsefailure_। मेरा जेसन _ {"कंटेनर" है: "डॉकर", "msg": "पायथन 26 अक्टूबर से"} _ –

5

डिफ़ॉल्ट रूप से टीसीपी सब कुछ संदेश फ़ील्ड में डाल देता है यदि जेसन कोडेक निर्दिष्ट नहीं है।

संदेश फ़ील्ड के _jsonparsefailure करने के लिए एक वैकल्पिक हल हम json कोडेक भी करने से सुधारा जा सकता है निर्दिष्ट करने के बाद निम्नलिखित:

input { 
    tcp { 
    port => '9563' 
    } 
} 
filter{ 
    json{ 
    source => "message" 
    target => "myroot" 
    } 
    json{ 
    source => "myroot" 
    } 

} 
output { 
    elasticsearch { 
     hosts => [ "localhost:9200" ] 
    } 
} 

यह उचित json स्ट्रिंग के लिए संदेश क्षेत्र पार्स जाएगा myroot मैदान में और तो जेरोसन पैदा करने के लिए myroot पार्स किया जाता है।

हम के रूप में

filter { 
    json { 
    source => "message" 
    remove_field => ["message"] 
    } 
} 
संबंधित मुद्दे