Skip to content

Instantly share code, notes, and snippets.

@mikybars
Last active October 30, 2019 10:46
Show Gist options
  • Select an option

  • Save mikybars/cee26759a7490dafb15dfc1658ed9585 to your computer and use it in GitHub Desktop.

Select an option

Save mikybars/cee26759a7490dafb15dfc1658ed9585 to your computer and use it in GitHub Desktop.
Maven, logback & log4j2 setup for logging JSON in Java
package com.example.logging.converters;
import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
public class ExceptionMessageConverter extends ThrowableProxyConverter {
@Override
protected String throwableProxyToString(IThrowableProxy tp) {
StackTraceElementProxy[] stackTrace = tp.getStackTraceElementProxyArray();
for (StackTraceElementProxy stackLine : stackTrace) {
stackLine.getStackTraceElement().
}
}
}
package com.example.logging.converters;
import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;
public class ExceptionNameConverter extends ThrowableProxyConverter {
@Override
protected String throwableProxyToString(IThrowableProxy tp) {
return tp.getClassName();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" packages="org.apache.logging.log4j.core">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<LogstashLayout dateTimeFormatPattern="yyyy-MM-dd'T'HH:mm:ss,SSS"
prettyPrintEnabled="false"
eventTemplateUri="classpath:log4j2EventLayout.json"
stackTraceEnabled="true"/>
</Console>
</appenders>
<loggers>
<root level="${env:SERVICE_LOG_LEVEL:-INFO}">
<appender-ref ref="Console" />
</root>
</loggers>
</configuration>
{
"loggingBackend": "log4j",
"executionTimestamp": "${json:timestamp}",
"level": "${json:level}",
"service": "${env:APPLICATION_NAME:-undefined}",
"operationId": "${json:mdc:operationId}",
"component": "${json:logger:name}",
"message": "${json:message}",
"exception": {
"name": "${json:exception:className}",
"message": "${json:exception:message}",
"stacktrace": "${json:exception:stackTrace:text}"
}
}
<configuration>
<!-- https://stackoverflow.com/a/52512131-->
<conversionRule conversionWord="exname" converterClass="com.example.logging.converters.ExceptionNameConverter"/>
<conversionRule conversionWord="exmessage" converterClass="com.example.logging.converters.ExceptionMessageConverter"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
{
"loggingBackend": "logback",
"executionTimestamp": "%date{yyyy-MM-dd'T'HH:mm:ss,SSS}",
"level": "%level",
"service": "${APPLICATION_NAME:-undefined}",
"operationId": "%mdc{operationId}",
"component": "%logger",
"message": "%message",
"exception": {
"name": "%exname",
"message": "%exmessage",
"stacktrace": "%throwable"
}
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="${SERVICE_LOG_LEVEL:-INFO}">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
<project>
<dependencies>
<!-- for logback -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>${logback-logstash.version}</version>
<scope>runtime</scope>
</dependency>
<!-- for log4j2 -->
<dependency>
<groupId>com.vlkan.log4j2</groupId>
<artifactId>log4j2-logstash-layout</artifactId>
<version>${log4j-logstash.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment