How to log in JSON with Logback?

I'm new to SLF4J and Logback and I'm trying to log every request and response of API following this link. Here's the configuration

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%requestURL | status code: %statusCode | bytes: %bytesSent | elapsed time: %elapsedTime | request-log: %magenta(%requestContent) | response-log: %cyan(%responseContent)</pattern>
        </encoder>
    </appender>
    <appender-ref ref="STDOUT"/>
</configuration>

Currently it's printing:

GET /api/request HTTP/1.1 | status code: 200 | bytes: 599 | elapsed time: 2630 | request-log:  | response-log {"key1":"field1","key2":"field2"}

And I want to log something like:

{
    "url": "GET /api/request HTTP/1.1",
    "status": 200,
    "elapsed_time": 2630 ,
    "response": {
        "key1":"value1",
        "key2":"value2"
    }
}

Upvotes: 8

Views: 20877

Answers (1)

Prashant Pandey
Prashant Pandey

Reputation: 4642

This would work:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <jsonFactoryDecorator class="JsonLogDecorator"/>
        <fieldNames>
            <timestamp>timeStamp</timestamp>
            <message>message</message>
            <logger>logger</logger>
            <thread>thread</thread>
            <level>level</level>
            <levelValue>[ignore]</levelValue>
            <version>[ignore]</version>
            <stackTrace>stackTrace</stackTrace>
        </fieldNames>
        <includeMdcKeyName>mdcKeyToInclude</includeMdcKeyName>
    </encoder>
</appender>

JsonLogDecorator is custom class that implements JsonFactoryDecorator.

Upvotes: 7

Related Questions