Spring Boot项目将日志输出至ELK编码实践

承接前文,ELK 日志中心已经搭建和启动完毕,本节笔者将讲解如何将程序中的日志信息输出到 ELK,以及如何在 Kibana 中配置和查看日志信息。

Java 工程对接 ELK 日志中心并不复杂,这里笔者先在一个普通的 Spring Boot 项目中进行编码,把日志输出到 ELK 日志中心,接入成功后,再进行 Spring Cloud Alibaba 微服务架构项目的改造。

本节代码是在第 4 章 Spring Boot 演示项目的基础上修改的,目录结构如图 13-13 所示。

image 2025 04 18 15 13 19 242
Figure 1. 图13-13 项目目录结构

具体编码步骤如下。

  1. 引入 logstash-logback-encoder 依赖。

    打开 pom.xml 文件,在 dependencies 节点下新增 logstash-logback-encoder 的依赖项,配置代码如下:

    <dependency>
      <groupId>net.logstash.logback</groupId>
      <artifactId>logstash-logback-encoder</artifactId>
      <version>7.0.1</version>
    </dependency>

    这里使用了 7.0.1 版本,并没有使用更高的版本,因为当前的 Spring Boot 版本为 2.6.3,使用高版本的 logstash-logback-encoder 会报错。

  2. 添加 Logback 日志配置文件。

    在项目的 src/main/resources 目录下创建 logback.xml 配置文件,在这个文件中定义两个 Appender 用来输出日志信息,代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <!--应用名称-->
        <property name="APP_NAME" value="newbee - mall - elk - log"/>
        <contextName>${APP_NAME}</contextName>
    
        <!-- 控制台的日志输出样式 -->
        <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy - MM - dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    
        <!-- 控制台输出 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>DEBUG</level>
            </filter>
            <!-- 日志输出编码 -->
            <encoder>
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
                <charset>utf8</charset>
            </encoder>
        </appender>
    
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>192.168.110.57:4560</destination>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>DEBUG</level>
            </filter>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
        </appender>
        <root level="DEBUG">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="LOGSTASH"/>
        </root>
    </configuration>

    第一个 AppenderConsoleAppender,名称为 CONSOLE,它可以将日志信息打印到控制台上,日志级别为 Debug

    第二个 AppenderLogstashTcpSocketAppender,名称为 LOGSTASH。因为在 ELK 日志中心配置时已经指定了 Logstash 实例使用 TCP 的方式接收日志信息,所以这个 Appender 会将日志信息输出到 Logstash

  3. 新增日志输出的测试代码。

    ltd.newbee.mall.controller 包中新建 ELKTestController 类,并新增如下代码:

    package ltd.newbee.mall.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class ELKTestController {
    
        private static final Logger log =
                LoggerFactory.getLogger(ELKTestController.class);
    
        @GetMapping("/elk-logs")
        @ResponseBody
        public String elkTest() {
            log.debug("DEBUG 级别日志输出 --> ELK");
            log.info("INFO 级别日志输出 --> ELK");
            log.error("ERROR 级别日志输出 --> ELK");
    
            return "hello,elk!";
        }
    }

在浏览器的地址栏中访问 /elk-logsIP 地址,会输出三条不同级别的测试日志。

最终的代码目录结构如图 13-14 所示。

image 2025 04 18 15 22 46 030
Figure 2. 图13-14 最终的代码目录结构

ELK 日志中心搭建完成后,如果在 Java 工程中想要接入 ELK 日志中心,只需要做两处改动就可以了,一处是添加依赖项,另一处是添加 Logback 配置文件。

至此,将日志输出至 ELK 编码就完成了。接下来,启动这个 Spring Boot 项目即可,日志成功输出后就能够在 Kibana 页面查看了。