SpringBoot整合ELK实现日志监控

Lou.Chen2023年1月9日
大约 3 分钟

Logstash

简介

一个具备实时数据传输能力的管道。它可以将数据从输入端(Spring Boot 日志)传送到输出端(Es)。数据在 Logstash 中传输的过程中,可以加入过滤器 Filter,对数据进行过滤。

安装

  • 可以使用 Docker 安装(不推荐)。

  • 直接安装

    • 下载地址:https://www.elastic.co/cn/downloads/logstash。这里使用的是open in new window Logstash 7.10.2ElasticSearch 7.9.3

    • 解压下载后的文件

    • 切换到config目录,可以按照logstash-sample.conf示例文件,添加连接的配置文件,这里新建logstash-springboot.conf文件,这中类型的文件可以有多个。

      • input中相关的为外部程序日志输入需要连接到logstash的配置信息

      • output.elasticsearch中为logstash处理后输入到ElastcSearch中的配置信息

        • elasticsearch.hosts指定ES服务端的实际地址,如果集群,那么可以指定多个地址

        • elasticsearch.index指定生成的日志索引的名称。log-louchen-dev后面为通配符的时间

      input {
        tcp {
          mode => "server"
          host => "0.0.0.0"
          port => 4560
          codec => json_lines
        }
      }
      filter {
      
      }
      output {
        elasticsearch {
          hosts => ["127.0.0.1:9200"]
          index => "log-louchen-dev-%{+yyyy.MM.dd}" 
        }
      }
      
      
    • 编辑config/pipelines.yml文件:

      • pipeline.id指定该管道id
      • path.config指定ES和logstash连接的配置文件,也就是上一步新建的conf文件的绝对路径
      - pipeline.id: log_dev
        path.config: "/Users/louchen/developEnviro/logstash-7.10.2/config/logstash-springboot.conf"
      
    • 切换到bin目录,执行./logstash

      • 打印如下内容,则代表启动成功
      image-20230109164224212

新建SpringBoot项目

pom依赖

首先创建一个 Spring Boot 工程,引入 web 依赖 和 logstash 相关的依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
				 <!--连接logstash相关依赖-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>6.6</version>
        </dependency>

创建日志配置文件

然后在 resources 目录下创建 logback-spring.xml 文件,也就是日志输出配置文件,SpringBoot默认的使用的logback日志必须叫这个名字

<?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="logstash"/>
    <!--日志文件保存路径-->
    <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
    <contextName>${APP_NAME}</contextName>
    <!--每天记录日志到文件appender-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>127.0.0.1:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

创建测试请求

@RestController
public class HelloController {
    
    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
    
    @GetMapping("/hello")
    public String hello() {
        logger.info("HelloController执行hello");
        return "hello";
    }
}

Kibana配置

  • SpringBoot项目启动后,可以看到默认已经创建出索引文件
image-20230109165913293image-20230109170012934

索引规则配置

  • 需要在kibana中,创建一个索引规则:

    • 点击堆栈管理Stack Mangement
    image-20230109170325035
    • 点击索引规则Index pattern

      image-20230109170458088
    • 然后创建索引规则

      image-20230109170907750
    • 通过输入的 log-loucher-dev-* 过滤出一条匹配的索引

      image-20230109171141396
    • 选择时间参数作为@timestamp通配符字段,然后点击右下角的Create index pattern

      image-20230109171317630
    • 创建的结果,可以看到索引的相关详细信息

      image-20230109171513215

索引文档查看

  • 点击Discover

    image-20230109172358345
  • 通过Refresh按钮进行数据的查看,左边可进行文档过滤

  • 通过索引文档内容可以知道,SpringBoot中控制台每一个线程打印的每一行日志都会生成一个文档

    • 文档中包含:时间、日志输出的结果信息、文档的版本、日志的级别、线程名、端口、执行的方法都全类名、文档id、文档索引名等
    image-20230109172457840image-20230109173648271