Elasticsearch+kibana+logstash 搭建日志收集分析平台


Elasticsearch+kibana+logstash 搭建日志收集分析平台

环境搭建:

虚拟机内存配置:

sysctl -w vm.max_map_count=262144

查看是否调整成功

sysctl -a|grep vm.max_map_count

永久修改:

vi /etc/sysctl.conf

在该conf文件最下方添加一行

vm.max_map_count=262144

elasticsearch配置

这里采用docker来进行部署,首先拉取elasticsearch的镜像

docker pull elasticsearch:7.16.3

注意: elasticsearch,kibana和logstash最好版本号要一致,避免出现兼容问题。

docker创建elk的网络

docker network create docker_elk

使用docker run创建elasticsearch容器

docker run -d --name elastic --net docker_elk -p 9200:9200 -p 9300:9300 \

-e "ES_JAVA_OPTS=-Xms64m -Xmx256m" -e "discovery.type=single-node" \

elasticsearch:7.16.3

启动后,通过docker exec命令进入容器

docker exec -it elastic /bin/bash

进入config文件夹

vi elasticsearch.yml

注意: 由于elasticsearch的官方镜像采用的是ubuntu系统,所以vi里面的操作方式跟centos有所不同,这里我们需要先移除掉再重新安装最新的

apt remove vim-common

然后升级

apt update

安装vim

apt install vim

编辑elasticsearch.yml,开启xpack认证,个人亲身经历如若不开xpack认证,会出现kibana索引模式无法创建的错误,可能跟安全认证有关。在yml文件下面添加以下字段。

xpack.security.enabled: true

xpack.security.transport.ssl.enabled: true

退出容器后,重新启动容器

docker restart elastic

再次进入容器,设置安全认证密码。

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

给elasticsearch默认用户设置密码,我这边就设置了123456

设置好后,我们来进行kibana的配置。

kibana配置

先拉取kibana镜像

docker pull kibana:7.16.3

创建kibana容器

docker run -d --name kibana --net docker_elk -p 5601:5601 kibana:7.16.3

然后接下来我们需要查看一下elasticsearch容器在我们的docker_elk网络中的地址

docker inspect elastic

在一片配置中下拉到network配置项中

可以看到elasticsearch容器的地址为172.19.0.2

进入kibana容器‘’

docker exec -it kibana /bin/bashw

进入config文件夹

cd config

编辑kibana.yml

server.host: "0.0.0.0"

server.shutdownTimeout: "5s"

elasticsearch.hosts: [ "http://172.19.0.2:9200" ]

monitoring.ui.container.elasticsearch.enabled: true

i18n.locale: "zh-CN"

elasticsearch.username: "elastic"

elasticsearch.password: "123456"

xpack.reporting.encryptionKey: "a_random_string"

xpack.security.encryptionKey: "something_at_least_32_characters"

elasticsearch.host中设置刚才network获取到的elasticsearch容器地址,然后修改

elasticsearch.password

修改完成后,退出并重启容器

docker restart kibana

logstash的配置

先拉取镜像

docker pull logstash:7.16.3

创建logstash 的配置文件

##创建目录 /data/logstash/config 和 配置文件 logstash.yml

/data/logstash/config/logstash.yml

##创建目录 /data/logstash/conf.d/ 和配置文件 logstash.conf

/data/logstash/conf.d/logstash.conf

logstash.yml配置如下:

http.host: "0.0.0.0"

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

xpack.monitoring.enabled: true

path.config: /usr/share/logstash/conf.d/*.conf

path.logs: /var/log/logstash

其中xpack.monitoring.elasticsearch.hosts配置项改为获取到的elasticsearch容器地址

logstash.conf的配置如下:

input {

 tcp {

 mode => "server"

 host => "0.0.0.0"

 port => 5047

 codec => json_lines

 }

}

output {

 elasticsearch {

 hosts => "172.19.0.2:9200"

 index => "springboot-logstash-%{+YYYY.MM.dd}"

 user => "elastic"

 password => "123456"

 }

}

下面host填写elastsearch容器地址,index为日志索引的名称,user和password填写xpack设置的密码,port为对外开放收集日志的端口

运行logstash

docker run -it -d -p 5047:5047 -p 9600:9600 \

--name logstash --privileged=true  --net docker_elk -v \

/data/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v \

/data/logstash/conf.d/:/usr/share/logstash/conf.d/ logstash:7.16.3

5047端口是刚才port设置的端口

注意: 这里有可能会出现jvm内存栈爆满

解决方法:

find / -name jvm.options

使用该指令寻找logstash的jvm配置

找到对应容器的配置文件并修改重启

-Xms128m

-Xmx256m

如果内存大可以适当调高

Springboot配置

在maven中添加Logstash依赖

 

 net.logstash.logback

 logstash-logback-encoder

 6.6

 

在resources目录下创建logback-spring.xml文件

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





 

 

 

 

 

 



 

 

 

 



 

 



 

 

 

 

 ${CONSOLE_LOG_PATTERN}

 

 

 



 

 

 

 ${LOG_HOME}/log_${SPRING_NAME}_%d{yyyy-MM-dd}_%i.log

 

 200MB

 

 

 

 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

 

 



 

 

 

 /app/log/biz/log_%d{yyyy-MM-dd}_%i.log

 

 200MB

 

 

 

 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

 

 



 

 

 

 

 

 

 

 xxx.xxx.xxx.xxx:5047

 

 

 

 

 Asia/Shanghai

 

 

 

 {

 "app_name":"${SPRING_NAME}",

 "traceid":"%X{traceid}",

 "ip": "%X{ip}",

 "server_name": "%X{server_name}",

 "level": "%level",

 "trace": "%X{X-B3-TraceId:-}",

 "span": "%X{X-B3-SpanId:-}",

 "parent": "%X{X-B3-ParentSpanId:-}",

 "thread": "%thread",

 "class": "%logger{40} - %M:%L",

 "message": "%message",

 "stack_trace": "%exception{10}"

 }

 

 

 

 

 



 

 

 

 

 

 

 

 



 

 

 

 

 

 

 



 

 

 

 



 

 

 




destination中填写部署logstash容器机器的ip地址,如果机器是本地则填写内网地址,如果是外网服务器,则填写外网ip,端口要和logstash配置文件中的port一致。

然后我们创建一些测试用例

@RestController

@Slf4j

public class LogController {



 @GetMapping("/test")

 public String showLog(){

 log.warn("日志测试,hahahahah");

 log.info("初始日志");

 log.debug("出现bug啦");

 log.error("出现错误");

 return "ok";

 }



}

运行Springboot

注意: 成功启用logback配置文件后,控制台输入会有所变化。

spring LOGO上会有logback的配置信息。

如若没变化,则表明logback配置文件没生效,没生效则logstash收集不了日志信息。

kibana查看信息

进入kibana输入账号密码后,来到该界面。

在索引管理中可以看到我们的日志索引。

下方索引模式选项创建索引模式

创建好后,在discover界面上就可以看到我们收集到的日志信息了。

结尾:

如果docker容器启动一会就自动停止了,大概率是出现错误了,这个时候可以使用docker logs 容器名 去查看容器的日志信息来寻找问题。

要注意logstash配置文件的端口要和springboot中logback配置文件中的端口一致

如果是阿里云或者腾讯云等云服务器,注意控制台防火墙也要开放相应端口

注意linux内部的防火墙,如果不是生产环境最好关闭。