Linux Docker Compose 搭建ELK 7.17.2版本

一、简述流程

  SpringBoot使用自带logback日志框架,整合LogstashTcpSocketAppender组件,把日志传输到 logstash,再由logstash对日志进行过滤采集到elasticsearch,最后通过kibana展示和查询日志数据。
Linux Docker Compose 搭建ELK 7.17.2版本_第1张图片

二、版本选择
产品 版本 备注
logstash 7.17.2
elasticsearch 7.17.2
kibana 7.17.2 从7.9开始,界面发生了很大的变化
docker 20.10.6 版本不强制,但是不要太低
docker-compose 1.19.0 版本不强制,但是不要太低
三、开始搭建
  1. 在root目录下创建elk相关数据,来存放docker-compose.yml文件和ELK的配置文件
    注意:以下配置文件的 IP(127.0.0.1) 都需要更换自己宿主机的 IP 或者安全域名
# 创建 elasticsearch 相关文件夹,赋予权限
mkdir -p /root/elk/elasticsearch/{plugins,data,logs}
chmod -R 775 /root/elk/elasticsearch/
# 创建 kibana 文件夹,并创建 kibana.yml 文件
mkdir -p /root/elk/kibana/config
touch /root/elk/kibana/config/kibana.yml
# 创建 logstatsh 相关文件夹,并创建 logstash.yml 文件 和 logstash.conf 文件
mkdir -p /root/elk/logstash/{config,pipeline} 
touch /root/elk/logstash/config/logstash.yml
touch /root/elk/logstash/pipeline/logstash.conf
# 创建docker-compose.yml文件
touch /root/elk/docker-compose.yml

kibana.yml

server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://127.0.0.1:9200" ]

logstash.yml

xpack.monitoring.elasticsearch.hosts: [ "http://127.0.0.1:9200" ]

logstash.conf

input {
  tcp {
    port => 4560
    codec => json_lines
  }
}
output {
    elasticsearch {
      hosts => "127.0.0.1:9200"
      # 这里的 spring.application.name 来自springboot中logback配置的数据
      index => "%{[spring.application.name]}-%{+YYYY.MM.dd}"
    }
}

docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.17.2
    container_name: elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
        # 设置集群名称
      - cluster.name=elasticsearch
        # 以单一节点模式启动
      - discovery.type=single-node
    volumes:
      - /root/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
      - /root/elk/elasticsearch/data:/usr/share/elasticsearch/data
      - /root/elk/elasticsearch/logs:/usr/share/elasticsearch/logs

  kibana:
    image: kibana:7.17.2
    container_name: kibana
    ports:
      - "5601:5601"
    depends_on:
      # kibana在elasticsearch启动之后再启动
      - elasticsearch
    environment:
      #设置系统语言文中文
      I18N_LOCALE: zh-CN
      # 访问域名
      # SERVER_PUBLICBASEURL: https://kibana.cloud.com
    volumes:
      - /root/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml

  logstash:
    image: logstash:7.17.2
    container_name: logstash
    ports:
      - "4560:4560"
    volumes:
      - /root/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - /root/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
    depends_on:
      - elasticsearch

在elk目录下执行 **docker-compose up -d ** 启动ELK,在浏览器访问 kibana端口号(5601)

Linux Docker Compose 搭建ELK 7.17.2版本_第2张图片
至此ELK搭建完成。

  1. 接下来需要配置启动SpringBoot项目给Logstash传输数据

① 在 pom.xml 当中添加 logstash-logback-encoder 依赖

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

② 在原本的 logback-spring.xml 文件里添加如下 LogstashTcpSocketAppender

<springProperty scope="context" name="appName" source="spring.application.name"/>
<!--输出到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"/>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp>
                <timeZone>Asia/Shanghai</timeZone>
            </timestamp>
            <pattern>
                <pattern>
                    {
                    "spring.application.name":"${appName}",
                    "traceid":"%X{traceid}",
                    "level": "%level",
                    "thread": "%thread",
                    "class": "%logger{40}",
                    "message": "%message\n%exception"
                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

注意还需要指定开启新配置的组件

<root level="debug">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    <!-- 指定传输logstash -->
    <appender-ref ref="LOGSTASH"/>
</root>

③ 编写Java Test测试类

@SpringBootTest
@RunWith(SpringRunner.class)
class FileApplicationTests {

    Logger log = LoggerFactory.getLogger(FileApplicationTests.class);

    @Test
    void testLogStash() {
        log.debug("这是debug日志");
        log.warn("这个是warn日志");
        log.info("这个是info日志");
        log.error("这个是error日志");
    }
}

启动运行这个测试类之后,前往Kibana控制台。
④ 打开Kibana,左侧菜单栏最下面的 Management 中的 Stack Management ,再找到索引模式,点击创建索引

Linux Docker Compose 搭建ELK 7.17.2版本_第3张图片
然后输入的名称需要匹配到后面的索引,然后点击创建索引模式

Linux Docker Compose 搭建ELK 7.17.2版本_第4张图片
⑤ 去左侧菜单栏 Analytics 下的 Discover 页面查看日志。

Linux Docker Compose 搭建ELK 7.17.2版本_第5张图片
 日志中蓝色背景的标签是可以筛选查看的,点击左侧,只查看level和message,使得日志更直观

Linux Docker Compose 搭建ELK 7.17.2版本_第6张图片
⑥ 修改@timestamp时间格式,默认的时间格式和日志的格式不一样,这个是可以配置的。

Linux Docker Compose 搭建ELK 7.17.2版本_第7张图片
至此,已经实现最简单的SpringBoot整合ELK。

⑦ 补充一个实时日志传输的功能配置

点击左侧菜单 Observatbility 下面的日志,然后点击右上角设置,选择Kibana索引模式

Linux Docker Compose 搭建ELK 7.17.2版本_第8张图片
选择之前配置的索引模式进行保存,然后返回左侧 Stream 界面,发现左侧就有实时流式传输按钮

Linux Docker Compose 搭建ELK 7.17.2版本_第9张图片
Linux Docker Compose 搭建ELK 7.17.2版本_第10张图片
我发现这个功能会比面那个会好一点,不过不能太依赖实时传输,一定记得看日志时间对不对。

四、完结

  这个只是初版,最低的安全配置都没有开,有很多配置都未完善,还需继续努力钻研,欢迎评论留言进行交流讨论,有要参考的同学,切记要记得改 IP

你可能感兴趣的:(个人学习,docker,linux,elk,springboot,elasticsearch)