Hi,

In a Grails app for my customer I'm using the LogstashTcpSocketAppender provided by this project https://github.com/logstash/logstash-logback-encoder.

It works perfectly fine with the logback.xml configuration which looks as follows:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>

<appender name="console" class="ch.qos.logback.core.ConsoleAppender"/>

<appender name="tcp" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:4560</destination>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<message/>
<mdc/>
<arguments/>
</providers>
</encoder>
</appender>

<root level="all">
<appender-ref ref="console"/>
<appender-ref ref="tcp"/>
</root>

</configuration>

However I had hard time configuring the same in logback.groovy; Do you have any idea how to configure LogstashTcpSocketAppender in groovy style? So far I came up with the following snippet which sucks a bit because it depends on Logback internals (mixed in ConfigurationDelegate properties/methods):

import ch.qos.logback.core.Appender
import net.logstash.logback.appender.LogstashTcpSocketAppender
import net.logstash.logback.composite.JsonProviders
import net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider
import net.logstash.logback.composite.loggingevent.MdcJsonProvider
import net.logstash.logback.composite.loggingevent.MessageJsonProvider
import net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder

appender('STDOUT', ConsoleAppender) {
encoder(PatternLayoutEncoder) {
pattern = '%-4relative [%thread] %msg%n'
}
}

addAppender('LOGSTASH_TCP', createLogstashTcpSocketAppender('localhost:4560'))

root(DEBUG, ['STDOUT', 'LOGSTASH_TCP'])

println appenderList

Appender createLogstashTcpSocketAppender(String destination) {
LoggingEventCompositeJsonEncoder encoder = new LoggingEventCompositeJsonEncoder()
JsonProviders providers = new JsonProviders()
providers.addProvider(new MessageJsonProvider())
providers.addProvider(new MdcJsonProvider())
providers.addProvider(new ArgumentsJsonProvider())
encoder.setProviders(providers)

Appender appender = new LogstashTcpSocketAppender()
appender.addDestination(destination)
appender.setEncoder(encoder)
appender
}

void addAppender(String name, Appender appender) {
appender.name = name
appender.context = context

appenderList.add(appender)
appender.start()
}

Regards,
Daniel Pacak