2016-04-15 17 views
8

Ich habe eine logback.groovy, die Daten an ein logstash im Netzwerk mit einigen benutzerdefinierten Feldern sendet:Logback.groovy LogstashEncoder Ändern Feldnamen

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

So weit so gut. Allerdings muss ich einige Feldnamen bereinigen, die für elasticsearch downstream nicht gültig sind. Basierend auf der LogstashEncoder Dokumentation kann dies wie folgt erreicht werden:

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

Dies scheint groß, aber ich habe diese in die logback.groovy Notation passen. Ich habe versucht, wie eine hashmap, string und mehr, aber immer am Ende mit Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'

Antwort

2

Versuchen Sie Folgendes. Möglicherweise müssen Sie auch für FieldNames und 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 
} 

einige Import hinzufügen können Sie die folgenden Helfer-Seite auf der Logback Webseite benutzen, um Ihre XML-Konfiguration in Groovy zu verwandeln.

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

+0

Interessante Antwort. Leider funktioniert es nicht wirklich. Die FieldNames existieren nicht per se. Ich konvertierte das in LogstashFieldNames und passte das ... an (was einen Kompilierungsfehler ergibt), aber es beschwert sich, dass es die timestamp-Eigenschaft dieser Klasse nicht setzen kann. –

1

Ich hatte etwas Ähnliches zu tun, obwohl ich den LoggingEventCompositeJsonEncoder Encoder wurde.

Der Ansatz, den ich verwenden musste, besteht darin, den logstash-logback-encoder-Code zu durchforsten, um die realen Klassen zu ermitteln. Glücklicherweise macht IntelliJs Decompiler dies nicht zu schmerzhaft.

Wenn man sich LogstashEncoder schauen hat es eine Methode public void setFieldNames(LogstashFieldNames fieldNames) - so, was Sie brauchen, ist eine Instanz von LogstashFieldNames

LogstashFieldNames wiederum Setter für setTimestamp und den Rest hat, so in groovy Ihre Syntax sein sollte:

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