Works as a charm. Thank you Ceki for detailed explanation and pointing the XML to Groovy translator out!

On Thu, Mar 24, 2016 at 11:46 AM, Ceki Gulcu <ceki@qos.ch> wrote:

Have you tried the logback.xml to logback.groovy translator? It is available at

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

Anyway, the logback.xml you provided translates into the following logback.groovy file:

import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.spi.LifeCycle
import net.logstash.logback.appender.LogstashTcpSocketAppender
import net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder

import static ch.qos.logback.classic.Level.ALL

appender("console", ConsoleAppender)
appender("tcp", LogstashTcpSocketAppender) {
  destination = "localhost:4560"
  encoder(LoggingEventCompositeJsonEncoder) {
    // You MUST add an import declaration as appropriate for [Providers]
    Providers... aProviders = new Providers()
    aProviders.message =
    aProviders.mdc =
    aProviders.arguments =
    if(aProviders instanceof LifeCycle)
      aProviders.start()
    providers = aProviders
  }
}
root(ALL, ["console", "tcp"])

You can fill in the missing statements without too much trouble.

Providers _providers = new LoggingEventCompositeJsonEncoder()
_providers.message = new MessageJsonProvider();
_providers.mdc = new MdcJsonProvider();
_providers.arguments = new ArgumentsJsonProvider();
if(_providers instanceof LifeCycle)
_providers .start()
providers = _providers

you would need to add the following imports for the above to work.

It looks like logstash-logback-encoder makes extensive use of Joran's (logback's xml configurator) @DefaultClass annotation as well as its default component initialization mechanism.

To cut a long story short, the more verbose but equivalent version of the logback.xml would be written as

<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 class="net.logstash.logback.composite.loggingevent.LoggingEventJsonProviders">
                <message class="net.logstash.logback.composite.loggingevent.MessageJsonProvider"/>
                <mdc class="net.logstash.logback.composite.loggingevent.MdcJsonProvider"/>
                <arguments class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
            </providers>
        </encoder>
    </appender>

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

</configuration>

When translated with the XML to Groovy translator, the results is


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

import static ch.qos.logback.classic.Level.ALL

appender("console", ConsoleAppender)
appender("tcp", LogstashTcpSocketAppender) {
  destination = "localhost:4560"
  encoder(LoggingEventCompositeJsonEncoder) {
    providers(LoggingEventJsonProviders) {
      message(MessageJsonProvider)
      mdc(MdcJsonProvider)
      arguments(ArgumentsJsonProvider)
    }
  }
}
root(ALL, ["console", "tcp"])


Both groovy scripts should work.

I hope this helps,

--
Ceki



On 3/24/2016 10:54, Daniel Pacak wrote:
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'])

printlnappenderList

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


_______________________________________________
logback-user mailing list
logback-user@qos.ch
http://mailman.qos.ch/mailman/listinfo/logback-user

_______________________________________________
logback-user mailing list
logback-user@qos.ch
http://mailman.qos.ch/mailman/listinfo/logback-user