本文所用系统环境:CentOS7
docker安装不在阐述
elk所有版本全部基于6.5.1
安装到集成一共三个大步骤:

一.安装ELK
二.安装kafka
三.SpringBoot集成kafka传输日志

一.安装ELK
1.kibana
直接执行以下代码,会自动执行安装以及启动全部过程

docker run -d -p 5601:5601 --name kibana --restart=always  kibana:6.5.1

将kibana容器内的 /usr/share/kibana 中的config文件拷贝到宿主机

docker cp kibana:/usr/share/kibana/config /home/kibana/config

删除容器后进入config文件下的
kibana.yml
删掉所有内容,添加:

server.host: "0.0.0.0"
elasticsearch.url: http://你的内网ip:9200

挂载启动,将宿主机文件替换到容器文件
挂载的方式为 宿主机路径:容器路径

docker run -d -p 5601:5601 --name kibana -v  /home/kibana/config:/usr/share/kibana/config --restart=always  kibana:6.5.1

原因是因为docker的隔离性质

2.下载elasticsearch

docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --restart=always elasticsearch:6.5.1

将es容器内的 /usr/share/elasticsearch/ 中的 config文件和data文件夹拷贝出到本地宿主机

docker cp es:/usr/share/elasticsearch/config /home/es/config   
docker cp es:/usr/share/elasticsearch/data /home/es/data

修改文件
config文件下的elasticsearch.yml

cluster.name: "elk"
network.host: 0.0.0.0

cluster.namez自己要记住,在集成到SpringBoot的时候需要用到
network.host是为了让所有的端口都可以访问他,有需要的自行更改

删除容器后挂载重启

docker run -d --name es -p 9200:9200 -p 9300:9300 -v /home/es/config:/usr/share/elasticsearch/config -v /home/es/data:/usr/share/elasticsearch/data -e "discovery.type=single-node" --restart=always elasticsearch:6.5.1

3.下载logstash

docker run -d --name=log -restart=always logstash:6.5.1

以下内容比较关键.请详细阅读:

1.容器启动的时候,使用的是加载文件目录pipeline的形式
2.logstash如果需要隔离的话,需要使用过滤插件,具体操作参考下面代码:

把文件夹pipeline和config文件夹全部拷贝出来

docker cp log:/usr/share/logstash/pipeline /home/logstash/pipeline  
docker cp log:/usr/share/logstash/config /home/logstash/config

修改pipelinne文件夹中的配置文件内容为

input{
     kafka {
        topics => "my-log-topic"
        type => "kafka"
        bootstrap_servers => "kafkaIp:9092"
        codec => json
  }
}
filter {
  json {
    source => "message"
  }
}

output {
  elasticsearch {
    hosts => ["http://esIP9200"]
    index => "logkafka-%{+YYYY.MM.dd}"
    index => "%{index}-%{+YYYY.MM.dd}"
    codec => json
 }
}

下面的内容是讲述过滤插件作用以及配置文件中的各项作用,请详细阅读.

其中,input为输入,output为输出.
kafka中的topics为你在kafka中指定的消费队列,在下面集成SpringBoot的时候会用到
bootstrap_servers为你的kafka队列内网ip和端口
codec 为json形式消费
filter 是过滤数据,所有的数据在logstash向es中写入的时候,是默认写在message字段中,我们在集成es查询的时候需要对数据进行字段检索 所以需要以k,v的形式,过滤器起到的作用就是把json拆分成k,v的形式写入es
elasticsearch中
hosts为你es的地址
第一个    index为你定义的索引,文中所述的为前缀logkafka-+日期
第二个是取json中的字段作为索引,留下一个就可以
codec 以json存储

修改config中pipelines.yml配置文件

- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline/logstash.conf"
- pipeline.id: log
  path.config: "/usr/share/logstash/pipeline/log.conf"

删除镜像重启logstash

docker run -d --name=log -v /home/logstash/pipeline:/usr/share/logstash/pipeline -v /home/logstash/config:/usr/share/logstash/config --restart=always logstash:6.5.1

pipeline.id 可以有多个,每一个代表不同的管道,走不通的配置文件
格式不要错
以上结束之后,elk安装已经安装以及配置完成.下面内容哦个开始为kafka安装以及和SpringBoot的集成

二.安装kafka
下载镜像

docker pull wurstmeister/zookeeper  
docker pull wurstmeister/kafka

启动zookeeper

docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper

启动kafka

docker run  -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.16.240.144:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.16.240.144:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka

进入kafka

docker exec -it kafka bash

修改文件/opt/kafka/config下server.properties配置文件,把最下面的

advertised.host.name修改为你的内网ip
zookeeper.connect修改为你的内网ip:2181

其余的不变
将kafka的config配置文件拿出来

docker cp kafka:/opt/kafka/config /home/kafka/config

删除容器,重启镜像

docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=ip:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://ip:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /home/kafka/config:/opt/kafka/config wurstmeister/kafka

至此kafka安装完成

三.集成SpringBoot

复制maven地址:

<dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.danielwegener</groupId>
            <artifactId>logback-kafka-appender</artifactId>
            <version>0.2.0-RC1</version>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.0</version>
        </dependency>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

在resources文件下创建文件logback.xml复制代码:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <!-- 相对路径 -->
    <property name="log.directory" value="./"/>
    <property name="logName" value="lnyd"/>

    <!-- 控制台输出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出,%d:日期;%thread:线程名;%-5level:级别,从左显示5个字符宽度;%msg:日志消息;%n:换行符-->
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.directory}/logs/${logName}.debug.log</File>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.directory}/logs/${logName}.debug.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.directory}/logs/${logName}.info.log</File>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.directory}/logs/${logName}.info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.directory}/logs/${logName}.error.log</File>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.directory}/logs/${logName}.error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--false:表示只用当前logger的appender-ref。 true:表示当前logger的appender-ref和rootLogger的appender-ref都有效 -->
    <logger name="hk.linktech.b2b.EventBusDemo" level="INFO" additivity="false">
        <appender-ref ref="stdout"/>
        <appender-ref ref="info"/>
        <appender-ref ref="error"/>
    </logger>


    <appender name="kafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <includeMdc>true</includeMdc>
            <includeContext>true</includeContext>
            <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                <maxDepthPerThrowable>30</maxDepthPerThrowable>
                <rootCauseFirst>true</rootCauseFirst>
            </throwableConverter>
        </encoder>
        <topic>my-log-topic</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.HostNameKeyingStrategy"/>
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.BlockingDeliveryStrategy"/>
        <!--<deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>-->
        <producerConfig>bootstrap.servers=127.0.0.1:9092</producerConfig>
        <producerConfig>acks=all</producerConfig>
        <producerConfig>batch.size=16384</producerConfig>
        <producerConfig>delivery.timeout.ms=60000</producerConfig>
        <!--<producerConfig>linger.ms=1</producerConfig>-->
        <producerConfig>buffer.memory=33554432</producerConfig>
    </appender>

    <appender name="kafkaAppenders" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <includeMdc>true</includeMdc>
            <includeContext>true</includeContext>
            <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                <maxDepthPerThrowable>30</maxDepthPerThrowable>
                <rootCauseFirst>true</rootCauseFirst>
            </throwableConverter>
        </encoder>
        <topic>my-log-topics</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.HostNameKeyingStrategy"/>
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.BlockingDeliveryStrategy"/>
        <!--<deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>-->
        <producerConfig>bootstrap.servers=127.0.0.1:9092</producerConfig>
        <producerConfig>acks=all</producerConfig>
        <producerConfig>batch.size=16384</producerConfig>
        <producerConfig>delivery.timeout.ms=60000</producerConfig>
        <!--<producerConfig>linger.ms=1</producerConfig>-->
        <producerConfig>buffer.memory=33554432</producerConfig>
    </appender>

    <logger name="elks" level="INFO">
        <appender-ref ref="kafkaAppenders"/>
    </logger>

    <logger name="elk">
        <appender-ref ref="kafkaAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="stdout"/>
        <appender-ref ref="info"/>
        <appender-ref ref="error"/>
    </root>
</configuration>

代码中一共有两个管道,分别以elk和elks区分在调用的时候使用lombok注解@Slf4j(topic=“你要发送的管道”)
上面指的管道就是logbak中的elk或者elks
他们分别指向的就是logstash中的各个管道,在模块中topic指定的发布地址.logstash消费的时候会根据配置的管道写入到es中
到这里集成便结束了.
在调用查看的时候,使用官方封装的es的API去调用,具体就不在这里阐述了