2016-04-15 26 views
8

私はいくつかのカスタムフィールドを持つネットワーク上のlogstashにデータを送信logback.groovyを持っています。しかし、elasticsearch downstreamには有効でないいくつかのフィールド名をクリーンアップする必要があります。 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

以下を試してみてください。また、あなたはGroovyのにあなたのXML設定を変換するためにLogbackのウェブサイト上で、次のヘルパーページを使用することができます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 
} 

ためのいくつかのインポートを追加する必要があります。

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

+0

興味深い回答です。残念ながら、それは実際には機能しません。 FieldNames自体は存在しません。私はそれをLogstashFieldNamesに変換し、...(これはコンパイルエラーを与える)しかし、それはそのクラスのタイムスタンププロパティを設定することができないと文句を言う。 –

1

私はLoggingEventCompositeJsonEncoderエンコーダを使用していたのに、私は、似た何かをしなければなりませんでした。

私が使用しなければならなかったアプローチは、logstash-logback-encoderコードを掘り下げて、実際のクラスを理解することでした。ありがたいことに、IntelliJの逆コンパイラはこれをあまりにも苦痛なものにしません。

あなたはLogstashEncoderを見れば、それは方法public void setFieldNames(LogstashFieldNames fieldNames)を持っている - あなたの構文があるべきグルーヴィーでので、あなたが必要なものを順番にLogstashFieldNames

LogstashFieldNamesのインスタンスは、setTimestampと休息のためのセッターを持っている:

encoder(LogstashEncoder) { 
     fieldNames(LogstashFieldNames) { 
      timestamp = "time" 
      message = "msg" 
     } 
    } 
関連する問題