Migrate from jackson to micronaut serde

This commit is contained in:
Stephan Schnabel 2023-07-19 14:58:11 +02:00 committed by Stephan Schnabel
parent d53a54b8c3
commit c654786978
16 changed files with 127 additions and 8 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>
```
## Features

View file

@ -114,6 +114,10 @@
<artifactId>micronaut-security</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.micronaut.serde</groupId>
<artifactId>micronaut-serde-api</artifactId>
</dependency>
<dependency>
<groupId>io.micronaut.test</groupId>
<artifactId>micronaut-test-junit5</artifactId>

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-log-json-from-env-serde-missing</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

@ -1,20 +1,23 @@
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.http.MediaType;
import io.micronaut.json.JsonMapper;
public class JsonLayout extends LayoutBase<ILoggingEvent> {
@ -28,8 +31,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 +43,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 +65,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 (IllegalStateException 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;
}