Migrate from jackson to micronaut serde

This commit is contained in:
Stephan Schnabel 2023-05-17 16:38:02 +02:00
parent c1f63ff146
commit 41eb8e911c
Signed by: stephan.schnabel
GPG key ID: E07AF5BA239FE543
17 changed files with 144 additions and 18 deletions

View file

@ -14,6 +14,12 @@ Include in your `pom.xml`:
<version>${version.io.kokuwa.micronaut.logging}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<!-- you can replace jsonp with jackson if you prefer jackson -->
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jsonp</artifactId>
<scope>runtime</scope>
</dependency>
```
Or use in `dependencyManagement` in `pom.xml`:

21
pom.xml
View file

@ -101,10 +101,10 @@
<!-- dependencies -->
<version.ch.qos.logback>1.4.7</version.ch.qos.logback>
<version.com.fasterxml.jackson>2.15.0</version.com.fasterxml.jackson>
<version.io.kokuwa.micronaut.logging>4.0.0-SNAPSHOT</version.io.kokuwa.micronaut.logging>
<version.io.micronaut>4.0.0-M3</version.io.micronaut>
<version.io.micronaut.security>4.0.0-M3</version.io.micronaut.security>
<version.io.micronaut.serde>2.0.0-M6</version.io.micronaut.serde>
<version.org.slf4j.api>2.0.7</version.org.slf4j.api>
<version.org.yaml.snakeyaml>2.0</version.org.yaml.snakeyaml>
@ -138,11 +138,6 @@
<artifactId>logback-core</artifactId>
<version>${version.ch.qos.logback}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${version.com.fasterxml.jackson}</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -185,6 +180,11 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-api</artifactId>
<version>${version.io.micronaut.serde}</version>
</dependency>
<dependency>
<groupId>io.micronaut.test</groupId>
<artifactId>micronaut-test-junit5</artifactId>
@ -221,10 +221,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
@ -271,6 +267,11 @@
<artifactId>micronaut-inject-java</artifactId>
<version>${version.io.micronaut}</version>
</path>
<path>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-processor</artifactId>
<version>${version.io.micronaut.serde}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>

View file

@ -9,4 +9,11 @@
</parent>
<artifactId>@project.artifactId@-it-log-gcp-from-env</artifactId>
<dependencies>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jsonp</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -9,4 +9,11 @@
</parent>
<artifactId>@project.artifactId@-it-log-gcp-from-gcloud</artifactId>
<dependencies>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jsonp</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -9,4 +9,11 @@
</parent>
<artifactId>@project.artifactId@-it-log-gcp-with-service</artifactId>
<dependencies>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jsonp</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>@project.groupId@</groupId>
<artifactId>@project.artifactId@-it</artifactId>
<version>LOCAL-SNAPSHOT</version>
</parent>
<artifactId>@project.artifactId@-it-log-json-from-env-serde-jackson</artifactId>
<dependencies>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jackson</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1 @@
invoker.environmentVariables.LOGBACK_APPENDER=JSON

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>@project.groupId@</groupId>
<artifactId>@project.artifactId@-it</artifactId>
<version>LOCAL-SNAPSHOT</version>
</parent>
<artifactId>@project.artifactId@-it-log-json-from-env-serde-jsonp</artifactId>
<dependencies>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jsonp</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,21 @@
// verify log
String expected = "^\\{\"timestamp\":\"[0-9]{13}\",\"level\":\"INFO\",\"thread\":\"main\",\"logger\":\"io.kokuwa.micronaut.logging.LoggingTest\",\"message\":\"test-output-marker\",\"raw-message\":\"test-output-marker\"}$";
String[] logs = org.codehaus.plexus.util.FileUtils.fileRead(basedir + "/build.log").split("\n");
for (String log : logs) {
if (!log.contains("test-output-marker")) {
continue;
}
if (java.util.regex.Pattern.matches(expected, log)) {
return true;
} else {
System.out.println("marker found, but formatting invalid:");
System.out.println("[EXPECTED] " + expected);
System.out.println("[ACTUAL] " + log);
return false;
}
}
System.out.println("marker not found");
return false;

View file

@ -0,0 +1 @@
invoker.environmentVariables.LOGBACK_APPENDER=JSON

View file

@ -8,5 +8,5 @@
<version>LOCAL-SNAPSHOT</version>
</parent>
<artifactId>@project.artifactId@-it-log-json-from-env</artifactId>
<artifactId>@project.artifactId@-it-serde-jackson</artifactId>
</project>

View file

@ -0,0 +1,5 @@
// verify log
return org.codehaus.plexus.util.FileUtils
.fileRead(basedir + "/build.log")
.contains("Failed to get object mapper from micronaut, please check your classpath");

View file

@ -9,4 +9,11 @@
</parent>
<artifactId>@project.artifactId@-it-log-json-from-kubernetes</artifactId>
<dependencies>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-jsonp</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -49,6 +49,7 @@
<version.io.kokuwa.micronaut.logging>@version.io.kokuwa.micronaut.logging@</version.io.kokuwa.micronaut.logging>
<version.io.micronaut>@version.io.micronaut@</version.io.micronaut>
<version.io.micronaut.serde>@version.io.micronaut.serde@</version.io.micronaut.serde>
</properties>
@ -81,6 +82,14 @@
<artifactId>micronaut-test-junit5</artifactId>
<version>${version.io.micronaut}</version>
</dependency>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-bom</artifactId>
<version>${version.io.micronaut.serde}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>

View file

@ -1,20 +1,24 @@
package io.kokuwa.micronaut.logging.layout;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TimeZone;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import ch.qos.logback.classic.pattern.ThrowableHandlingConverter;
import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.LayoutBase;
import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.status.StatusUtil;
import ch.qos.logback.core.util.StatusListenerConfigHelper;
import io.micronaut.context.exceptions.NoSuchBeanException;
import io.micronaut.http.MediaType;
import io.micronaut.json.JsonMapper;
public class JsonLayout extends LayoutBase<ILoggingEvent> {
@ -28,8 +32,6 @@ public class JsonLayout extends LayoutBase<ILoggingEvent> {
public static final String EXCEPTION_ATTR_NAME = "exception";
public static final String CONTEXT_ATTR_NAME = "context";
private final ObjectMapper mapper = new ObjectMapper();
protected boolean includeLevel = true;
protected boolean includeThreadName = true;
protected boolean includeMDC = true;
@ -42,6 +44,7 @@ public class JsonLayout extends LayoutBase<ILoggingEvent> {
private String timestampFormat;
private String timestampFormatTimezoneId;
private ThrowableHandlingConverter throwableHandlingConverter = new ThrowableProxyConverter();
private JsonMapper mapper;
@Override
public String getContentType() {
@ -63,9 +66,22 @@ public class JsonLayout extends LayoutBase<ILoggingEvent> {
@Override
public String doLayout(ILoggingEvent event) {
var map = toJsonMap(event);
if (mapper == null) {
try {
mapper = JsonMapper.createDefault();
} catch (NoSuchBeanException e) {
if (!StatusUtil.contextHasStatusListener(context)) {
addError("Failed to get object mapper from micronaut, please check your classpath");
StatusListenerConfigHelper.addOnConsoleListenerInstance(context, new OnConsoleStatusListener());
}
return map.toString() + CoreConstants.LINE_SEPARATOR;
}
}
try {
return mapper.writeValueAsString(map) + CoreConstants.LINE_SEPARATOR;
} catch (JsonProcessingException e) {
return new String(mapper.writeValueAsBytes(map), StandardCharsets.UTF_8) + CoreConstants.LINE_SEPARATOR;
} catch (IOException e) {
addError("Failed to write json from event " + event + " and map " + map, e);
return null;
}