Ratpacked: Use Asynchronous Logging
Ratpack is designed to be asynchronous. Here's how to match its logging.
Join the DZone community and get the full member experience.
Join For FreeRatpack is from the ground up build to be performant and asynchronous. Let's add a logging implementation that matches the asynchronous nature of Ratpack. Ratpack uses the SLF4J API for logging and if we write logging statement in our own code we should use the same API. For Groovy developers it is nothing more than adding the @Slf4j
AST annotation to our classes. The Logback library has an asynchronous appender which has a queue to store incoming logging events. Then a worker on a different thread will invoke a classic blocking appender, like a file or console appender, to actually log the messages. But in our example we don't use the standard async appender from Logback, but use a asynchronous logbook appender from the Reactor project. Now our queue is backed by a very performant reactor ring buffer implementation.
The following Logback configuration file shows how we can configure the reactor.logback.AsyncAppender
:
<!-- File: src/main/resources/logback.xml -->
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{32} - %msg%n</pattern>
</encoder>
</appender>
<!-- Create new asynchronous Logback appender backed by Reactor RingBufferProcessor. -->
<appender name="ASYNC" class="reactor.logback.AsyncAppender">
<!-- Backlog size for logging events. Change size if they are picked up slowly.
Default is 1024 * 1024 -->
<backlog>1048576</backlog>
<!-- Caller data is relatively slow, so per default disabled -->
<includeCallerData>false</includeCallerData>
<!-- Redirect logging messages to STDOUT -->
<appender-ref ref="STDOUT"/>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC"/>
</root>
</configuration>
We need to add a runtime dependency for io.projectreactor:reactor-logback
in our build.gradle
file to use theAsyncAppender
:
...
repositories {
jcenter()
}
dependencies {
runtime 'ch.qos.logback:logback-classic:1.1.3'
runtime 'io.projectreactor:reactor-logback:2.0.5.RELEASE'
}
...
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments