2016-04-15 13 views
8

ho un logback.groovy che invia i dati a un logstash in rete con alcuni campi personalizzati:Logback.groovy LogstashEncoder nomi dei campi che alterano

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

Fin qui tutto bene. Tuttavia, ho bisogno di pulire alcuni nomi di campi che non sono validi per elasticsearch a valle. Sulla base della documentazione LogstashEncoder, questo può essere realizzato in questo modo:

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

Questo sembra grande, ma devo inserire questo in notazione logback.groovy. Ho provato come hashmap, stringa e altro ma sempre finiscono con Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'

risposta

2

Provare quanto segue. Potrebbe anche essere necessario aggiungere un po 'di importazione per FieldNames e 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 
} 

È possibile utilizzare la seguente pagina di supporto sul sito web Logback per trasformare la vostra configurazione XML in Groovy.

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

+0

Risposta interessante. Purtroppo, non funziona davvero. Il FieldNames non esiste di per sé. L'ho convertito in LogstashFieldNames e adattato il ... (che dà un errore di compilazione) ma si lamenta che non può impostare la proprietà timestamp di quella classe. –

1

che dovevo fare qualcosa di simile, anche se stavo usando l'encoder LoggingEventCompositeJsonEncoder.

L'approccio che ho dovuto utilizzare è scavare nel codice logstash-logback-encoder per elaborare le classi reali coinvolte. Per fortuna il decompilatore di IntelliJ rende questo non troppo doloroso.

Se si guarda LogstashEncoder Ha un metodo di public void setFieldNames(LogstashFieldNames fieldNames) - quindi quello che vi serve è un esempio di LogstashFieldNames

LogstashFieldNames a sua volta ha setter per setTimestamp e il resto, così in Groovy la sintassi dovrebbe essere:

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