Quarkus 登录 json 在 openshift okd 版本 3.11 中不起作用

Quarkus logging to json is not working in openshift okd version 3.11

我在使用 Quarkus 在 Openshift 中进行日志记录时遇到了挑战,因为我尝试获取的 JSON 格式在测试语言环境时确实有效,但是当 运行 在 Openshift 上使用它时,我一直保持正常日志行。这样做的问题是,日志消息在 Elasticsearch 数据库中都是单行的,并且不包括添加的 MDC 值。

主要问题:

示例数据

locale,当 运行 为:mvnw.cmd compile quarkus:dev 日志为 json 格式:例如:

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}

将其部署到 Openshift 时:日志记录保留为普通日志文件,其中每一行都被视为一个单独的日志条目:

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?

配置

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>

版本

在 Openshift 上,loggerManager 的类型为 java.util.logManager,而在本地系统上,loggerManager 的类型为 org.jboss.logmanager.LogManager

通过使用 属性 在 Openshift 上启动 java 进程:-Djava.util.logging.manager=org.jboss.logmanager.LogManager 日志被写为 JSON。