最近在linux下搭建了一套ELK环境,ELK简单来说,ElasticSearch 作为搜索引擎存储数据,Logstash 负责收集数据并输出给ElasticSearch ,Kibana 可以理解为elasticsearch的显示面板。
本文搭建的ELK环境,主要用来收集应用系统的日志,是单机版;如果想升级成集群版,可以将ElasticSearch 部署成集群,哪个服务器需要采集数据就安装Logstash, 显示面板Kibana可以只安装在一个服务器节点即可。
由于ElasticSearch 需要 JDK 环境,所以要提前安装好 JDK 。另外,可能jdk的安装路径各有不同,所以可以提前给jdk建立一个软连接 (否则elasticSearch启动时会报错)。
which java
ln -s 执行which java所显示的路径 /usr/bin/java
通常 ElasticSearch 及kibana 都是不用root去启动的,所以这里创建一个新用户 ES。
useradd es
passwd es
创建完用户之后,要对其进行授权。下面的 elk安装 ,我专门建了一个 文件夹,然后将该文件夹授权给ES用户,如果操作过程中不小心忘了赋权限,执行不了启动命令,就再授权一下。
[root@ELK-slave home]# cd /usr/local/
[root@ELK-slave local]# mkdir elk
[root@ELK-slave local]# chown -R es:es /usr/local/elk
下面进行安装 ,注意一点,3个软件这里都是通过安装包进行部署的,要注意版本的一致性。下面安装时,可切换到 es用户。
在 /usr/local/elk/ 下建立 es文件夹,下载安装包,并解压
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-linux-x86_64.tar.gz
解压完成后,修改配置文件。配置中要指定数据和日志路径,所以我提前建好文件夹。
修改config目录下的elasticsearch.yml文件,加入以下内容(单机配置)
cluster.name: es
node.name: node-1
path.data: /usr/local/elk/es/data
path.logs: /usr/local/elk/es/log
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.179.129"]
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"
配置完成后,执行启动命令
nohup ./elasticsearch > /usr/local/elk/es/run.log 2>&1 &
查看运行日志,并访问对应的链接,http://192.168.179.129:9200/
到这里,就启动成功了。
其实在启动时,可能会报虚拟内存不足、最大文件数太小等问题,所以如果启动失败,可以进行以下配置
1.切换root用户 ,编辑 limits.conf (vi /etc/security/limits.conf),末尾加入以下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
2.切换root用户,修改 sysctl.conf (vi /etc/sysctl.conf),加入如下配置
vm.max_map_count=655360
并执行以下命令,使配置生效。
sysctl -p
完成上述配置后,切换到es用户,重新启动。
在 /usr/local/elk/ 下建立 logstash文件夹,下载安装包,并解压
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.2.tar.gz
logstash通过 input采集数据,output 输出数据,并且支持过滤功能。输入、输出都支持多种插件,如标准输入、文件输入、kafka 等,输出包括 elasticsearch 、文件,kafka等等。
为方便,先使用 标准输入输出查看下效果,进入bin目录,执行以下命令
./logstash -e 'input { stdin{} } output { stdout{} }'
我们的目的是输出到 elasticsearch ,所以使用 标准输入,并输出到 elasticsearch 再测试一下
./logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.179.129:9200"] } }'
输入字符,然后查看对应的elasticsearch中是否存在
至此,说明logstash输出到 elasticsearch没有问题,这时可以进行正式配置了。logstash启动时,输入、输出的配置都通过配置文件来定义,进入config 目录,创建 springboot-logstash.conf文件。
这里要采集系统应用的日志,输入采用 文件方式,修改 springboot-logstash.conf 配置
input {
file {
path => "/usr/local/activity/info.log"
type => "activity"
start_position => "beginning"
}
file {
path => "/usr/local/activityapi/info.log"
type => "activityapi"
start_position => "beginning"
}
}
output {
if [type] == "activity" {
elasticsearch {
hosts => ["192.168.179.129"]
index => "activity-%{+YYYY.MM.dd}"
}
} else if [type] == "activityapi" {
elasticsearch {
hosts => ["192.168.179.129"]
index => "activityapi-%{+YYYY.MM.dd}"
}
}
}
执行启动命令
nohup ./logstash -f ../config/springboot-logstash.conf --config.reload.automatic 2>&1 &
不同的应用(activity、activityapi),建立了不同的索引,并以日为单位做分割,可以查看elasticsearch的索引情况
此时,logstash启动成功
在 /usr/local/elk/ 下建立 kibana文件夹,下载安装包,并解压
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.6.2-linux-x86_64.tar.gz
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.179.129:9200"]
然后启动即可,注意,不能使用root用户启动,切换到es用户
nohup ./kibana &
启动之后,访问 链接 http://192.168.179.129:5601/
kibana安装之后,做一下配置就可以使用了,先找到管理页面,点击 Index Patterns
第一步,定义的 index pattern ,其实和 elasticsearch 对应的 index有关,比如上文中 activity 的日志,都是以 activity- 为前缀,我定义 activity-* ,就可以匹配对应的所有日期下的日志
第二步,点击保存
同理,我对 activityapi 也配置对应的 index pattern,activityapi* 。
然后点击discover版块,可以看到对应的数据
我们可以通过切换对应 的index pattern ,来查看相关的日志
这就相当于,有了一个实时可视化的tail -f 日志工具,并且支持内容搜索。
至此,单机版的ELK环境就搭建完成了。