I have a challenge with loggings in Openshift with Quarkus as the JSON format I'm trying to get does work when testing locale, but when running it on Openshift I keep getting normal log lines. The problem with this is that log messages are all single lines in the Elasticsearch database and added MDC values are not included.
Main questions:
- Is this default behavior on Openshift OKD, or might it be a problem with the base image?
- Is there a way to adjust this behavior?
- How else might I make sure that logs are processed in JSON style for my specific project in Openshift OKD?
Example data
locale, when run with: mvnw.cmd compile quarkus:dev
the log is in json format: e.g:
Listening for transport dt_socket at address: 5005
Listening for transport dt_socket at address: 5005
{"timestamp":"2020-09-29T11:53:37.276+02:00","sequence":254,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus.deployment.QuarkusAugmentor","level":"WARN","message":"Using Java versions older than 11 to build Quarkus applications is deprecated and will be disallowed in a future release!","threadName":"main","threadId":1,"mdc":{},"ndc":"","hostName":"...","processName":"openshiftlogtest-dev.jar","processId":5740}
{"timestamp":"2020-09-29T11:53:40.658+02:00","sequence":1444,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus","level":"INFO","message":"openshiftlogtest 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.8.1.Final) started in 3.509s. Listening on: http://0.0.0.0:8080","threadName":"Quarkus Main Thread","threadId":69,"mdc":{},"ndc":"","hostName":"...","processName":"openshiftlogtest-dev.jar","processId":5740}
{"timestamp":"2020-09-29T11:53:40.659+02:00","sequence":1445,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus","level":"INFO","message":"Profile dev activated. Live Coding activated.","threadName":"Quarkus Main Thread","threadId":69,"mdc":{},"ndc":"","hostName":"...","processName":"openshiftlogtest-dev.jar","processId":5740}
{"timestamp":"2020-09-29T11:53:40.66+02:00","sequence":1446,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus","level":"INFO","message":"Installed features: [cdi, resteasy]","threadName":"Quarkus Main Thread","threadId":69,"mdc":{},"ndc":"","hostName":"...","processName":"openshiftlogtest-dev.jar","processId":5740}
{"timestamp":"2020-09-29T11:59:52.5+02:00","sequence":1447,"loggerClassName":"org.jboss.slf4j.JBossLoggerAdapter","loggerName":"com.onetrail.cis.healthcare.ExampleResource","level":"INFO","message":"Hello\r\nwho ami?\r\n","threadName":"executor-thread-1","threadId":73,"mdc":{"testKey":"testValue"},"ndc":"","hostName":"...","processName":"openshiftlogtest-dev.jar","processId":5740}
When deploying it to Openshift: The logging stays a plain log file where each line is seen as a separate log entry:
INFO: Installed features: [cdi, resteasy]
Sep 29, 2020 9:31:39 AM com.onetrail.cis.healthcare.ExampleResource hello
INFO: Hello
who ami?
Sep 29, 2020 9:31:42 AM com.onetrail.cis.healthcare.ExampleResource hello
INFO: Hello
who ami?
Sep 29, 2020 9:31:44 AM com.onetrail.cis.healthcare.ExampleResource hello
INFO: Hello
who ami?
Configuration
pom.xml:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>.../artifactId>
<version>...</version>
<properties>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<maven.compiler.parameters>true</maven.compiler.parameters>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus-plugin.version>1.8.1.Final</quarkus-plugin.version>
<quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
<quarkus.platform.version>1.8.1.Final</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
<ch.qos.logback.version>1.2.3</ch.qos.logback.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-logging-json</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<activation>
<property>
<name>native</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<quarkus.package.type>native</quarkus.package.type>
</properties>
</profile>
</profiles>
</project>
Versions
- docker base image: fabric8/s2i-java latest
- OpenShift Master: v3.11.0+d55192e-371
- Kubernetes Master: v1.11.0+d4cacc0
- OpenShift Web Console:v3.11.0+ea42280
- Image vesrion labelss:
- Java: Java version: 1.8.0_252, vendor: Oracle Corporation
- Maven: 3.5.4
On Openshift the loggerManager was of type
java.util.logManager
while on local system the loggerManager was of typeorg.jboss.logmanager.LogManager
By starting on Openshift the java process with the property:
-Djava.util.logging.manager=org.jboss.logmanager.LogManager
The log was written as JSON.