8.12. 为可引导 JAR 启用 JSON 日志记录

您可以通过使用 CLI 脚本配置服务器日志配置,为您的可引导 JAR 启用 JSON 日志记录。启用 JSON 日志记录时,您可以使用 JSON 格式查看 JSON 格式的日志消息。

此流程中的示例演示了如何在裸机平台和 OpenShift 平台上为可引导 JAR 启用 JSON 日志记录。

先决条件

  • 您已检查了最新的 Maven 插件版本,如 MAVEN_PLUGIN_VERSION.X.GA.Final-redhat-00001,其中 MAVEN_PLUGIN_VERSION 是主版本,X 是 microversion。请参阅 /ga/org/wildfly/plugins/wildfly-jar-maven-plugin 的索引
  • 您已检查了最新的 Galleon 功能包版本,如 3.0.X.GA-redhat-BUILD_NUMBER,其中 X 是 JBoss EAP XP 和 BUILD_NUMBER 的 次要版本,是 Galleon 功能包的构建号。XBUILD_NUMBER 在 JBoss EAP XP 3.0.0 产品生命周期中都可能会演变。请参阅 /ga/org/jboss/eap/wildfly-galleon-pack 的索引
  • 您已创建了 Maven 项目,设置父依赖项,并添加了用于创建应用的依赖项。请参阅 创建可引导 JAR Maven 项目

    重要

    在 Maven 项目的 Maven archetype 中,您必须指定特定于项目的 groupID 和 artifactID。例如:

    $ mvn archetype:generate \
    -DgroupId=com.example.logging \
    -DartifactId=logging \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false
    cd logging
    注意

    流程中显示的示例指定以下属性:

    • 用于 Maven 插件版本的 ${bootable.jar.maven.plugin.version}
    • Gall eon 功能包版本的 ${JBoss.xp.galleon.feature.pack.version}

    您必须在项目中设置这些属性。例如:

    <properties>
        <bootable.jar.maven.plugin.version>4.0.3.Final-redhat-00001</bootable.jar.maven.plugin.version>
        <jboss.xp.galleon.feature.pack.version>3.0.0.GA-redhat-00001</jboss.xp.galleon.feature.pack.version>
    </properties>

流程

  1. 将由 BOM 管理的 JBoss Logging 和 Jakarta RESTful Web Services 依赖项添加到项目的 pom.xml 文件的 <dependencies> 部分。例如:

    <dependencies>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.ws.rs</groupId>
            <artifactId>jboss-jaxrs-api_2.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
  2. 将以下内容添加到 pom.xml 文件的 <build> 元素 中。您必须指定任何 Maven 插件的最新版本,以及 org.jboss.eap:wildfly-galleon-pack Galleon 功能包的最新版本。例如:

    <plugins>
        <plugin>
            <groupId>org.wildfly.plugins</groupId>
            <artifactId>wildfly-jar-maven-plugin</artifactId>
            <version>${bootable.jar.maven.plugin.version}</version>
            <configuration>
                <feature-packs>
                    <feature-pack>
                        <location>org.jboss.eap:wildfly-galleon-pack:${jboss.xp.galleon.feature.pack.version}</location>
                    </feature-pack>
                </feature-packs>
                <layers>
                    <layer>jaxrs-server</layer>
                 </layers>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>package</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  3. 创建用于存储 Java 文件的目录:

    $ mkdir -p APPLICATION_ROOT/src/main/java/com/example/logging/

    其中 APPLICATION_ROOT 是含有应用的 pom.xml 配置文件的目录。

  4. 创建包含以下内容的 Java 文件 RestApplication.java,并将该文件保存到 APPLICATION_ROOT/src/main/java/com/example/logging/ 目录中:

    package com.example.logging;
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("/")
    public class RestApplication extends Application {
    }
  5. 创建包含以下内容的 Java 文件 HelloWorldEndpoint.java,并将该文件保存到 APPLICATION_ROOT/src/main/java/com/example/logging/ 目录中:

    package com.example.logging;
    
    import javax.ws.rs.Path;
    import javax.ws.rs.core.Response;
    import javax.ws.rs.GET;
    import javax.ws.rs.Produces;
    
    import org.jboss.logging.Logger;
    @Path("/hello")
    public class HelloWorldEndpoint {
    
        private static Logger log = Logger.getLogger(HelloWorldEndpoint.class.getName());
        @GET
        @Produces("text/plain")
        public Response doGet() {
            log.debug("HelloWorldEndpoint.doGet called");
            return Response.ok("Hello from XP bootable jar!").build();
        }
    }
  6. 创建 CLI 脚本,如 logging.cli,并将它保存在可引导 JAR 中的可访问目录中,如 APPLICATION_ROOT/scripts 目录,其中 APPLICATION_ROOT 是 Maven 项目的根目录。该脚本必须包含以下命令:

    /subsystem=logging/logger=com.example.logging:add(level=ALL)
    /subsystem=logging/json-formatter=json-formatter:add(exception-output-type=formatted, pretty-print=false, meta-data={version="1"}, key-overrides={timestamp="@timestamp"})
    /subsystem=logging/console-handler=CONSOLE:write-attribute(name=level,value=ALL)
    /subsystem=logging/console-handler=CONSOLE:write-attribute(name=named-formatter, value=json-formatter)
  7. 将以下配置提取添加到插件 <configuration> 元素中:

    <cli-sessions>
            <cli-session>
            <script-files>
                <script>scripts/logging.cli</script>
            </script-files>
        </cli-session>
    </cli-sessions>

    本例显示了 logging.cli CLI 脚本,该脚本修改服务器日志配置文件,以为您的应用启用 JSON 日志记录。

  8. 将应用打包为可引导 JAR。

    $ mvn package
  9. 可选 : 要在 JBoss EAP 裸机平台上运行应用,请按照在 JBoss EAP 裸机平台上使用可引导 JAR 中所述的步骤进行操作, 但会有以下差异:

    1. 启动应用程序:

      mvn wildfly-jar:run
    2. 验证:您可以通过在浏览器中指定以下 URL 来访问应用

      预期输出:您可以在应用程序控制台中查看 JSON 格式的日志,包括 com.example.logging.HelloWorldEndpoint 调试追踪。

  10. 可选 : 要在 JBoss EAP OpenShift 平台上运行应用程序,请完成以下步骤:

    1. 在插件配置中添加 <cloud/> 元素。例如:

      <plugins>
         <plugin>
             ... <!-- You must evolve the existing configuration with the <cloud/> element  -->
             <configuration >
                 ...
                 <cloud/>
              </configuration>
          </plugin>
      </plugins>
    2. 重新构建应用程序:

      $ mvn clean package
    3. 使用 oc login 命令登录 您的 OpenShift 实例。
    4. 在 OpenShift 中创建新项目:例如:

      $ oc new-project bootable-jar-project
    5. 输入以下 oc 命令来创建应用程序镜像:

      $ mkdir target/openshift && cp target/logging-bootable.jar target/openshift 1
      
      $ oc import-image ubi8/openjdk-11 --from=registry.redhat.io/ubi8/openjdk-11 --confirm
       2
      
      $ oc new-build --strategy source --binary --image-stream openjdk-11 --name logging 3
      
      $ oc start-build logging --from-dir target/openshift 4
      1
      创建 target/openshift 子目录。打包的应用复制到 openshift 子目录中。
      2
      将最新的 OpenJDK 11 镜像流标签和镜像信息导入到 OpenShift 项目中。
      3
      根据日志记录目录和 OpenJDK 11 镜像流创建构建配置。
      4
      使用 target/openshift 子目录作为二进制输入来构建应用。
    6. 部署应用程序:

      $ oc new-app logging
      
      $ oc expose svc/logging
    7. 获取路由的 URL。

      $ oc get route logging --template='{{ .spec.host }}'
    8. 使用上一命令返回的 URL 访问 Web 浏览器中的应用。例如:

      http://ROUTE_NAME/hello
    9. 验证: 运行以下命令来查看可用的 OpenShift pod 列表,并检查 pod 构建状态:

      $ oc get pods

      访问应用的正在运行的容器集日志。其中 APP_POD_NAME 是正在运行的容器集日志记录应用程序的名称。

      $ oc logs APP_POD_NAME

      预期结果:pod 日志采用 JSON 格式,包括 com.example.logging.HelloWorldEndpoint 调试追踪。

其他资源