ELK介绍:
ELK是一组开源工具的缩写,它由Elasticsearch、Logstash和Kibana三个组件组成,用于处理、分析和可视化大量日志数据。
入门级ELK搭建(无Docker环境)
安装前准备
1.获取安装包
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.2-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-7.16.2-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/logstash/logstash-7.16.2-linux-x86_64.tar.gz
我将以上三个包统一存放在/usr/local目录下
2.创建用户组及用户
备注:由于elasticsearch不允许使用root启动,创建以下用户及yoghurt组以备用
【添加组】【用户组名】
groupadd elsearch
【添加用户】【用户名】-g【用户组名】-p【密码值】
useradd elsearch -g elsearch -p elsearch
3.统一处理
1)将三个包解压
tar -zxvf elasticsearch-7.16.2-linux-x86_64.tar.gz
tar -zxvf logstash-7.16.2-linux-x86_64.tar.gz
tar -zxvf kibana-7.16.2-linux-x86_64.tar.gz
2)将解压后的目录及权限交给刚创建的elsearch用户
chown -R elsearch:elsearch /usr/local/elasticsearch-7.16.2
chown -R elsearch:elsearch /usr/local/logstash-7.16.2
chown -R elsearch:elsearch /usr/local/kibana-7.16.2-linux-x86_64
一、elasticsearch配置
1.配置
修改配置文件elasticsearch.yml
cd /usr/local/elasticsearch-7.16.2/config
vim elasticsearch.yml
按以下方式进行修改:
#集群名称(按实际需要配置名称)
cluster.name: chy-elasticsearch
#节点名称
node.name: node-1
#数据路径(按实际需要配置日志地址)
path.data: /usr/local/elasticsearch-7.16.2/data
#日志路径(按实际需要配置日志地址)
path.logs: /usr/local/elasticsearch-7.16.2/logs
#地址(通常使用内网进行配置)
network.host: 127.0.0.1
#端口号
http.port: 18201
#节点地址
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
#集群master
cluster.initial_master_nodes: ["node-1"]
#跨域(这两项配置手动添加一下)
http.cors.enabled: true
http.cors.allow-origin: "*"
2.启动
cd /usr/local/elasticsearch-7.16.2/bin
nohup ./elasticsearch >/dev/null &
3.观察是否启动
观察日志判断elasticsearch 是否启动
cd /usr/local/elasticsearch-7.16.2/logs
tail -fn 100 /usr/local/elasticsearch-7.16.2/logs/chy-elasticsearch.log
注:上面这条语句结尾的‘chy-elasticsearch.log’为配置中的cluster.name的值
二、logstash配置
1.配置文件准备
修改配置文件logstash-sample.conf
cd /usr/local/logstash-7.16.2/config
cd /usr/local/logstash-7.16.2/config
···
cp logstash-sample.conf logstash.conf
···
2.修改配置
vim logstash.conf
注意:为了方便解释含义,以下包含注释‘#’的行请手动去除
input {
#配合使用filebeats的端口,可忽略
beats {
port => 5044
}
#logstash向elasticsearch 传输数据端口
tcp{
port => 5701
codec =>"json"
}
}
#以下配置为创建用户索引及默认索引情况
output {
if[appname] != "" {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
index => "%{[appname]}-%{+YYYY.MM.dd}"
}
} else {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
}
3.启动
cd /usr/local/logstash-7.16.2/bin
nohup ./logstash -f /usr/local/logstash-7.16.2/config/logstash.conf >../logs/logstash.log &
4.观察是否启动
查看日志检查logstash是否成功启动
cd /usr/local/logstash-7.16.2/logs
tail -fn 100 logstash.log
三、kibana配置
1.修改配置文件
cd /usr/local/kibana-7.16.2-linux-x86_64/config
vim kibana.yml
按以下进行配置
#服务端口(按实际需求)
server.port: 18501
#服务主机(这里是服务器内网地址)
server.host: "172.16.176.60"
#服务名(按实际需求)
server.name: "chy-Kibana"
#elasticsearch地址
elasticsearch.hosts: ["http://127.0.0.1:18201"]
#设置简体中文
i18n.locale: "zh-CN"
2.启动
cd /usr/local/kibana-7.16.2-linux-x86_64/bin
nohup ./kibana >/dev/null &
3.观察是否启动
浏览器打开:http://{kibana服务器IP}:{端口}/app/home
例如:http://192.168.1.120:18501/app/home
出现kibana首页则表明启动成功
Docker中搭建ELK系统
前言
1.需要准备一台linux服务器(最好是CentOS7),内存至少4g以上(三个组件都比
较占用内存)
2.需要有docker使用经验
1 docker安装ElasticSearch
这里先创建一个网络:因为我们还需要部署kibana容器、logstash容器,需要让这些容器互联。
docker network create elk-net
这里ElasticSearch采用的是7.12.1版本
在docker中搜索和下载对应的镜像
#搜索镜像
docker search elasticsearch
#下载镜像
docker pull elasticsearch:7.12.1
有了镜像以后,可以直接创建对应的容器,命令如下:
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-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 es-data:/usr/share/elasticsearch/data :挂载逻辑卷,绑定es的数据目录
-v es-logs:/usr/share/elasticsearch/logs :挂载逻辑卷,绑定es的日志目录
-v es-plugins:/usr/share/elasticsearch/plugins :挂载逻辑卷,绑定es的插件目录
--privileged :授予逻辑卷访问权
--network elk-net :加入一个名为es-net的网络中
-p 9200:9200 :端口映射配置
在浏览器中输入:http://192.168.200.130:9200 (按照自己的ip访问)即可看到elasticsearch的响应结果:
2 docker安装kibana
创建容器(如果不提前下载好,在创建容器时,会先下载,然后创建容器)
docker run -d \
--name kibana \
-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.200.130:5601,即可看到结果
3 docker安装logstash
3.1 创建容器
docker run -d -p 5044:5044 -p 9600:9600 --name logstash --
network=elk-net logstash:7.12.1
3.2 修改配置
3.2.1 设置ES的地址
创建完容器之后,需要在容器修改一些配置
#进入容器
docker exec -it logstash /bin/bash
找到config目录中的logstatsh.yml文件
修改里面的内容,设置es服务的地址,如下
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.200.130:9200" ] #设置跟es的服务地址
3.2.2 设置logstash收集日志的输入和输出
进入容器
#进入容器
docker exec -it logstash /bin/bash
找到pipeline目录中的logstatsh.conf文件
修改如下,可以设置数据输入的方式,也可以设置把数据存放到哪里
input {
tcp {
mode => "server"
host => "0.0.0.0" # 允许任意主机发送日志
port => 5044
codec => json_lines # 数据格式
}
}
output {
elasticsearch {
hosts => ["http://192.168.200.130:9200"] # ElasticSearch 的地址和端口
index => "log-%{+YYYY.MM.dd}" # 指定索引名,可以根据自己的需求指定命名
codec => "json"
}
stdout {
codec => rubydebug
}
}
修改完所有的配置后,需要重启logstash容器
docker restart logstash
其他配置
JAVA中使用(spring boot)
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
注意以下图片中destination标签,它定义了logstash传输日志的ip及端口号,有两种方式:
1.直接写在标签里面(下图中灰色注释这种)
2.从spring配置中读取(上图中圈起来的springProperty标签),再如下图中通过${**}的方式引入
代码如下:
<springProperty scope="context" name="logstash.destination" source="logstash.destination"/>
<appender name="logStash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<param name="Encoding" value="UTF-8"/>
<!-- 日志过滤器(参见) -->
<filter class="com.****.****.common.log.CustomLogFilesFilter"/>
<!--<destination>101.37.65.233:18401</destination>-->
<destination>${logstash.destination}</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<!-- 索引名appname对应logStash配置中创建的索引 -->
<customFields>{"appname":"${logback.appname}"}</customFields>
</encoder>
</appender>
<!-- 最后别忘了这个 -->
<root level="info">
<appender-ref ref="logStash" />
</root>