ELK是三个开源软件的缩写,分别是Elasticsearch、Logstash、Kibana,一般情况下会结合FileBeat使用。
Elasticsearch:是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Kibana:是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Logstash:主要是用来日志的搜集、分析、过滤日志的工具,支持多种多样的数据获取方式。一般工作方式为c/s架构,Client端安装在需要收集日志的服务器上,Server端负责将收到的各节点日志进行过滤、修改等操作,再一并发往Elasticsearch上去。
Filebeat:轻量级数据收集引擎,隶属于Beats。是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。目前Beats包含四种工具:Packetbeat(搜集网络流量数据)、Topbeat(搜集系统、进程和文件系统级别的CPU和内存使用情况等数据)、Filebeat(搜集文件数据)、Winlogbeat(搜集Windows事件日志数据)。
因为本文介绍的是基于docker安装Yapi,所以先决条件是系统必须先安装好docker才能往下走,如果对docker的安装还不熟悉的可以查看我的另一篇文章【Linux安装最新版Docker完整教程】,安装完之后再往下看。
#下载最新版docker-compose
curl -L https://github.com/docker/compose/releases/download/2.16.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#添加可执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本信息
docker-compose --version
#创建es挂载目录
mkdir -p /mnt/elk/es/{config,data,logs,plugins}
#赋予777权限
chmod 777 /mnt/elk/es/{config,data,logs,plugins}
#创建kibana挂载目录
mkdir -p /mnt/elk/kibana/{config,plugins}
#赋予777权限
chmod 777 /mnt/elk/kibana/{config,plugins}
#创建logstash挂载目录
mkdir -p /mnt/elk/logstash/{config,pipeline}
#赋予777权限
chmod 777 /mnt/elk/logstash/{config,pipeline}
#创建filebeat挂载目录
mkdir -p /mnt/elk/filebeat/{config,logs}
#赋予777权限
chmod 777 /mnt/elk/filebeat/{config,logs}
在/mnt/elk/es/config目录下创建 elasticsearch.yml文件,内容如下:
network.host: 0.0.0.0 #使用的网络
http.cors.enabled: true #跨域配置
http.cors.allow-origin: "*"
#xpack.security.enabled: true #开启密码配置
在/mnt/elk/kibana/config目录下创建kibana.yml
i18n.locale: "zh-CN" #汉化
server.name: "kibana"
server.host: "0.0.0.0"
server.shutdownTimeout: "10s"
elasticsearch.hosts: ["http://elasticsearch:9200"]
#elasticsearch.username: "kibana_system" #注意不能用elastic超管账号登录
#elasticsearch.password: "在es中设置kibana_system的密码"
在/mnt/elk/logstash/pipeline目录下创建logstash.conf文件,内容如下:
input {
beats {
port => 5044
}
}
filter {
grok {
match => {
"message" => "(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:LEVEL}%{SPACE}%{JAVACLASS:javaClass}#(?[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:msg}"
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "test-log"
user => "elastic"
password => "XXXXXX"
}
}
在/mnt/elk/logstash/config目录下创建logstash.yml文件,内容如下:
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]
#xpack.monitoring.elasticsearch.username: "elastic"
#xpack.monitoring.elasticsearch.password: "在es中设置elastic的密码"
在/mnt/elk/filebeat/config目录下创建filebeat.yml文件,内容如下:
# 定义应用的input类型、以及存放的具体路径
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/logapp/*.log #日志输出地址
tags: ["test-log"]
#============================= Filebeat modules ===============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
# ============================== logstash =====================================
output.logstash:
hosts: ["logstash:5044"]
enabled: true
在/mnt/elk目录下创建docker-compose.yml文件,内容如下:
version: '3'
services:
elasticsearch:
image: elasticsearch:8.5.3 #镜像
container_name: elasticsearch #定义容器名称
restart: always #开机启动,失败也会一直重启
privileged: true
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx1024m" #设置使用jvm内存大小
volumes:
- /mnt/elk/es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- /mnt/elk/es/data:/usr/share/elasticsearch/data #数据文件挂载
- /mnt/elk/es/logs:/usr/share/elasticsearch/logs #日志文件挂载
- /mnt/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
ports:
- "9200:9200"
- "9300:9300"
networks:
- elk_net
kibana:
image: kibana:8.5.3
container_name: kibana
restart: always
privileged: true
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
volumes:
- /mnt/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
ports:
- 5601:5601
networks:
- elk_net
logstash:
image: logstash:8.5.3
container_name: logstash
restart: always
privileged: true
volumes:
- /mnt/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
- /mnt/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
ports:
- 5044:5044
networks:
- elk_net
filebeat:
container_name: filebeat
image: elastic/filebeat:8.5.3
user: "root"
depends_on:
- elasticsearch
- logstash
- kibana
restart: on-failure
privileged: true
volumes:
- /mnt/elk/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml
- /mnt/elk/filebeat/logs:/var/log/logapp
networks:
- elk_net
networks:
elk_net:
driver: bridge
#修改sysctl.conf配置,否则启动可能会报错
vim /etc/sysctl.conf
{
vm.max_map_count=262144
}
#刷新文件,使配置生效
sysctl -p
#进入ELK容器编排文件所在目录
cd /mnt/elk
#启动ELK容器编排
docker-compose up -d
#查看容器启动情况
docker ps
#进入es容器设置账号密码登录
docker exec -it elasticsearch /bin/bash
#执行设置:elastic、apm_system、kibana_system、logstash_system、beats_system、remote_monitoring_user共6个用户账号密码
./bin/elasticsearch-setup-passwords interactive -u 'http://192.168.0.132:9200'
#退出容器
exit
#修改elasticsearch.yml配置文件开启密码校验
{
xpack.security.enabled: true
}
#重启es容器
docker restart elasticsearch
#修改kibana.yml配置文件使用密码登录es
{
monitoring.ui.container.elasticsearch.username: "kibana_system"
monitoring.ui.container.elasticsearch.password: "刚刚在es中设置kibana_system的密码"
}
#重启kibana容器
docker restart kibana
#安装json_lines插件
docker exec -it logstash /bin/bash
#进入bin目录
cd bin
logstash-plugin install logstash-codec-json_lines
#退出容器
exit
#修改
{
#xpack.monitoring.elasticsearch.username: "elastic"
#xpack.monitoring.elasticsearch.password: "在es中设置elastic的密码"
}
#重启logstash容器
docker restart logstash
查看索引管理
往/mnt/elk/filebeat/logs添加日志文件test.log
进入视图管理器查看收集到的日志信息