本文所用系统环境: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地址:
ch.qos.logback
logback-core
ch.qos.logback
logback-access
ch.qos.logback
logback-classic
com.github.danielwegener
logback-kafka-appender
0.2.0-RC1
net.logstash.logback
logstash-logback-encoder
5.0
org.springframework.boot
spring-boot-starter-data-elasticsearch
在resources文件下创建文件logback.xml复制代码:
%date{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n
${log.directory}/logs/${logName}.debug.log
DEBUG
ACCEPT
DENY
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n
${log.directory}/logs/${logName}.debug.%d{yyyy-MM-dd}.log
${log.directory}/logs/${logName}.info.log
INFO
ACCEPT
DENY
${log.directory}/logs/${logName}.info.%d{yyyy-MM-dd}.log
30
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n
${log.directory}/logs/${logName}.error.log
ERROR
ACCEPT
DENY
${log.directory}/logs/${logName}.error.%d{yyyy-MM-dd}.log
30
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n
true
true
30
true
my-log-topic
bootstrap.servers=127.0.0.1:9092
acks=all
batch.size=16384
delivery.timeout.ms=60000
buffer.memory=33554432
true
true
30
true
my-log-topics
bootstrap.servers=127.0.0.1:9092
acks=all
batch.size=16384
delivery.timeout.ms=60000
buffer.memory=33554432
代码中一共有两个管道,分别以elk和elks区分在调用的时候使用lombok注解@Slf4j(topic=“你要发送的管道”)
上面指的管道就是logbak中的elk或者elks
他们分别指向的就是logstash中的各个管道,在模块中topic指定的发布地址.logstash消费的时候会根据配置的管道写入到es中
到这里集成便结束了.
在调用查看的时候,使用官方封装的es的API去调用,具体就不在这里阐述了