Docker搭建ELK【elasticsearch+logstash+kibana】日志分析系统详细教程

作者博客: www.lstar.icu

开源地址
Gitee 地址: https://gitee.com/lxwise
Github 地址: https://github.com/lxwise

1.前言

1.需要准备一台linux服务器(最好是CentOS7),内存至少4g以上(三个组件都比较占用内存)

2.需要有docker使用经验

2.ELK简介

ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架的首字母大写简称。市面上也被称为Elastic Stack。其中 Elasticsearch 是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch作为底层支持的框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们称Elasticsearch 为 es。Logstash 是 ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/Redis/Elasticsearch/Kafka等)。Kibana 可以将 Elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能。简单来说,ELK就是集数据收集、传输、存储、分析、告警为一体的近实时日志分析搜索系统。

  • elasticsearch
    E – Elasticsearch(存储,查询),分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储,分析,以及强大的数据搜索和聚合功能。

  • logstash
    L – logstash(收集),数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。

  • kibana
    K – kibana(展示),数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能。

3.ELK部署

3.1docker安装ElasticSearch

这里先创建一个网络:因为我们还需要部署kibana容器、logstash容器,需要让这些容器互联。

docker network create elk-net

这里ElasticSearch采用的是7.12.1版本

在docker中搜索和下载对应的镜像

#搜索镜像
docker search elasticsearch
#下载镜像
docker pull elasticsearch:7.12.1

有了镜像以后,可以直接创建对应的容器,命令如下:

mkdir -p /root/mydata/elasticsearch/config
mkdir -p /root/mydata/elasticsearch/data
mkdir -p /root/mydata/elasticsearch/plugins

chmod -R 777 /root/mydata/elasticsearch/

docker run -d \
	--name es \
	--restart=always \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v /root/mydata/elasticsearch/data:/usr/share/elasticsearch/data \
    -v /root/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network elk-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

命令解释:

  • -e "cluster.name=es-docker-cluster":设置集群名称
  • -e "http.host=0.0.0.0":监听的地址,可以外网访问
  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m":内存大小
  • -e "discovery.type=single-node":非集群模式
  • -v /root/mydata/elasticsearch/data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录
  • -v /root/mydata/elasticsearch/logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录
  • -v /root/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录
  • --privileged:授予逻辑卷访问权
  • --network elk-net :加入一个名为es-net的网络中
  • -p 9200:9200:端口映射配置

在浏览器中输入:http://192.168.12.53:9200 (按照自己的ip访问)即可看到elasticsearch的响应结果:
在这里插入图片描述

3.2docker安装kibana

在docker中搜索和下载对应的镜像

#搜索镜像
docker search kibana
#下载镜像
docker pull kibana:7.12.1

创建容器(如果不提前下载好,在创建容器时,会先下载,然后创建容器)

docker run -d \
--name kibana \
--restart=always \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-e "I18N_LOCALE=zh-CN" \
--network=elk-net \
-p 5601:5601  \
kibana:7.12.1
  • --network elk-net :加入一个名为es-net的网络中,与elasticsearch在同一个网络中
  • -e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
  • -p 5601:5601:端口映射配置

此时,在浏览器输入地址访问:http://192.168.12.53:5601 (按照自己的ip访问),即可看到结果

在这里插入图片描述

3.3docker安装logstash

在docker中搜索和下载对应的镜像

#搜索镜像
docker search logstash
#下载镜像
docker pull logstash:7.12.1

创建容器(如果不提前下载好,在创建容器时,会先下载,然后创建容器)

docker run -d -p 5044:5044 -p 9600:9600 --name --restart=always logstash --network=elk-net logstash:7.12.1

3.3.1 设置ES的地址

创建完容器之后,需要在容器修改一些配置

#进入容器
docker exec -it logstash /bin/bash

找到config目录中的logstatsh.yml文件

bash-4.2$ cd /usr/share/logstash/config/
bash-4.2$ ls
jvm.options  log4j2.properties  logstash-sample.conf  logstash.yml  pipelines.yml  startup.options
bash-4.2$

修改里面的内容,设置es服务的地址,如下

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.12.53:9200" ] #设置跟es的服务地址

3.3.2 设置logstash收集日志的输入和输出

进入容器

#进入容器
docker exec -it logstash /bin/bash

找到pipeline目录中的logstatsh.conf文件

bash-4.2$ cd /usr/share/logstash/pipeline/
bash-4.2$ ls
logstash.conf

修改如下,可以设置数据输入的方式,也可以设置把数据存放到哪里

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"  # 允许任意主机发送日志
    port => 5044
    codec => json_lines    # 数据格式
  }
}

output {
  elasticsearch {
      hosts  => ["http://192.168.12.53:9200"]   # ElasticSearch 的地址和端口
      index  => "log-%{+YYYY.MM.dd}"         # 指定索引名,可以根据自己的需求指定命名
      codec  => "json"
  }
  stdout {
    codec => rubydebug
  }
}

修改完所有的配置后,需要重启logstash容器

docker restart logstash

4.应用系统对接logstash

在项目的pom文件中添加新的依赖

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

目前,我们采用的logback来采集日志进行上报给logstash

需要在resources目录中新增一个文件logback-spring.xml(注意命名,不要修改)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <springProperty scope="context" name="serverPort" source="server.port"/>
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--logstash的服务地址和端口,可以实际情况设置-->
        <destination>192.168.12.53:5044</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        <!--应用名称 -->
                        "app": "${springAppName}_${serverPort}",
                        <!--打印时间 -->
                        "timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                        <!--线程名称 -->
                        "thread": "%thread",
                        <!--日志级别 -->
                        "level": "%level",
                        <!--日志名称 -->
                        "logger_name": "%logger",
                        <!--日志信息 -->
                        "message": "%msg",
                        <!--日志堆栈 -->
                        "stack_trace": "%exception"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    <!--定义日志文件的存储地址,使用绝对路径-->
    <property name="LOG_HOME" value="/home/logs"/>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/${springAppName}-${serverPort}-%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="FILE" />
        <appender-ref ref="CONSOLE" />
    </root>


</configuration>

也可以在专门在application.yml文件中设置logback配置的目录

logging:
  config: classpath:logback-spring.xml

对接项目之后,可以启动项目,产生一些日志数据

posted @ 2025-04-17 16:09  虞泽  阅读(38)  评论(0)    收藏  举报  来源