2016-04-15 7 views
8

मैं एक logback.groovy कुछ कस्टम क्षेत्रों के साथ नेटवर्क पर एक logstash को डेटा भेजती हैं की है। हालांकि, मुझे कुछ फ़ील्ड नामों को साफ़ करने की आवश्यकता है जो लोचदार खोज डाउनस्ट्रीम के लिए मान्य नहीं हैं। LogstashEncoder प्रलेखन के आधार पर, इस इस तरह हासिल किया जा सकता:Logback.groovy LogstashEncoder फेरबदल फ़ील्ड नाम

<encoder class="net.logstash.logback.encoder.LogstashEncoder"> 
    <fieldNames> 
    <timestamp>time</timestamp> 
    <message>msg</message> 
    ... 
    </fieldNames> 
</encoder> 

इस महान लगता है, लेकिन मैं logback.groovy अंकन में इस फिट करने के लिए किया है। मैंने एक हैशैप, स्ट्रिंग और अधिक के रूप में प्रयास किया लेकिन हमेशा Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'

उत्तर

2

के साथ प्रयास करें। निम्नलिखित का प्रयास करें। तुम भी FieldNames और LifeCycle

appender("LOGSTASH", LogstashTcpSocketAppender) { 
    encoder(LogstashEncoder) { 
    customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }""" 

    FieldNames... aFieldNames = new FieldNames() 
    aFieldNames.timestamp = "time" 
    aFieldNames.message = "msg" 
    if(aFieldNames instanceof LifeCycle) 
     aFieldNames.start() 
    fieldNames = aFieldNames 
    } 
    remoteHost = "logstashlistener.host.name" 
    port = 5000 
} 

आप ग्रूवी में आपके XML विन्यास को बदलने के लिए Logback वेबसाइट पर निम्नलिखित सहायक पेज उपयोग के कुछ आयात जोड़ने की जरूरत हो सकती है।

http://logback.qos.ch/translator/asGroovy.html

+0

दिलचस्प जवाब। अफसोस की बात है, यह वास्तव में काम नहीं करता है। फ़ील्ड नाम प्रति से मौजूद नहीं है। मैंने इसे LogstashFieldNames में परिवर्तित कर दिया और अनुकूलित किया ... (जो एक संकलन त्रुटि देता है) लेकिन यह शिकायत करता है कि यह उस वर्ग की टाइमस्टैम्प संपत्ति सेट नहीं कर सकता है। –

1

मैं, इसी तरह कुछ करने के लिए हालांकि मैं LoggingEventCompositeJsonEncoder एनकोडर का उपयोग कर रहा था।

जिस दृष्टिकोण का उपयोग करना है, वह है जो वास्तविक कक्षाओं को शामिल करने के लिए लॉगस्टैश-लॉगबैक-एन्कोडर कोड के माध्यम से खोदना है। शुक्र है कि इंटेलिजे का डिकंपेलर इसे बहुत दर्दनाक नहीं बनाता है।

आप LogstashEncoder को देखें, तो यह एक तरीका है public void setFieldNames(LogstashFieldNames fieldNames) गया है - तो क्या आप की जरूरत LogstashFieldNames का एक उदाहरण है

LogstashFieldNames बारी में, setTimestamp के लिए setters और बाकी है, इसलिए ग्रूवी में अपने वाक्य रचना होना चाहिए:

encoder(LogstashEncoder) { 
     fieldNames(LogstashFieldNames) { 
      timestamp = "time" 
      message = "msg" 
     } 
    } 
संबंधित मुद्दे