
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