2016-04-15 33 views
8

我有將數據發送到logstash一些自定義字段在網絡上logback.groovy:Logback.groovy LogstashEncoder改變字段名

appender("LOGSTASH", LogstashTcpSocketAppender) { 
    encoder(LogstashEncoder) { 
    customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }""" 
    } 
    remoteHost = "logstashlistener.host.name" 
    port = 5000 
} 

到目前爲止好。但是,我需要清理一些對於下游的elasticsearch無效的字段名稱。 基於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

請嘗試以下操作。您可能還需要增加一些進口的FieldNamesLifeCycle

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 
} 

可以使用的logback網站上的以下網頁助手改變你的XML配置成Groovy的。

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

+0

有趣的答案。可悲的是,它並不真正奏效。 FieldNames本身不存在。我將它轉換爲LogstashFieldNames並將其修改爲...(這會產生編譯錯誤),但它抱怨說它無法設置該類的timestamp屬性。 –

1

我必須做同樣的事情,雖然我用的是LoggingEventCompositeJsonEncoder編碼器。

我不得不使用的方法是挖掘logstash-logback-encoder代碼來計算出真正的類。謝天謝地,IntelliJ的反編譯器使得這不是太痛苦。

如果你看一下LogstashEncoder它的方法public void setFieldNames(LogstashFieldNames fieldNames) - 所以你需要的是LogstashFieldNames的實例

LogstashFieldNames反過來又爲setTimestamp制定者和休息,所以在常規的語法應爲:

encoder(LogstashEncoder) { 
     fieldNames(LogstashFieldNames) { 
      timestamp = "time" 
      message = "msg" 
     } 
    }