快速安装EFK日志系统并抓取json格式的NGINX日志
前言
EFK指的是日志管理系统套件elasticsearch,filebeat,kibana这三个开源软件所组成的一套软件。也就是说,这三个软件通常是配合在一起使用的。当然,比较常用的套件搭配是ELK,也就是elasticsearch,logstash,kibana这三个软件组成一个套件。
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
Filebeat是一个轻量级日志传输Agent,可以将指定日志转发到Logstash、Elasticsearch、Kafka、Redis等中。Filebeat占用资源少,而且安装配置也比较简单,支持目前各类主流OS及Docker平台。
Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
Elasticsearch、Logstash和Kibana这三个技术就是我们常说的ELK技术栈,可以说这三个技术的组合是大数据领域中一个很巧妙的设计。一种很典型的MVC思想,模型持久层,视图层和控制层。Logstash担任控制层的角色,负责搜集和过滤数据。Elasticsearch担任数据持久层的角色,负责储存数据。而Kibana担任视图层角色,拥有各种维度的查询和分析,并使用图形化的界面展示存放在Elasticsearch中的数据。
多说几句,elasticsearch是使用java开发的,意思很清楚,凡是要运行elasticsearch的地方都需要有java环境,filebeat是使用go语言开发的,因此轻量,高效,尤其是相对于logstash。kibana是使用js开发的,这个没什么好说的。
一、安装步骤
- 安装方式 清华源的RPM包直接安装,因为是套件,所以必须三个软件版本一致,二进制方式也可以,但网速限制过多。
- 安装环境的基本要求 epel源,最好是阿里云的
- 安装环境的介绍 :既然是快速安装,就单机EFK,两台机器,第一台--安装EK,第二台安装F和NGINX,
- 第一台的配置:虚拟机,centos7,内核版本3.11,IP 192.168.0.17,4CPU4G内存
- 第二台的配置:虚拟机,centos7,内核版本3.11,IP 192.168.0.18.4CPU4G内存
二、RPM相关包的下载
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-6.x/6.8.12/
该页面内下载 filebeat-6.8.12-x86_64.rpm elasticsearch-6.8.12.rpm kibana-6.8.12-x86_64.rpm
三、第一台机器的安装配置
yum install java-1.8.0-openjdk* -y 命令执行完毕后,java -version 查看,有输出版本jdk安装完毕。
当然,也可以使用二进制包安装,但该方法需要在后续的elasticsearch和kibana内指定JAVA_HOME,安装脚本为我写的博客:
- 安装elasticsearch
rpm -ivh elasticsearch-6.8.12.rpm 或者yum install elasticsearch-6.8.12.rpm -y
该软件只有唯一环境依赖jdk,没有别的软件依赖,安装完毕后修改配置文件
vim /etc/elasticsearch/elasticsearch.yml
找到network.host和http.port ,值修改为如下,(该文件为yaml语言配置文件,该语言在ansible和saltstack中广泛使用,需要特别注意空格什么的,其内容一般为键值对形式存在)
network.host: 192.168.0.17
http.port: 9200
- 启动服务并加入开机启动
systemctl enable elasticsearch
systemctl start elasticsearch#重点说一下,这个服务脚本不会当时报警(有错没错不知道,必须看下status,和k8s比较类似)
- 验证服务是否正常
systemctl status elasticsearch #查看服务状态
curl 192.168.0.17:9200#如果有返回内容如下,正常,服务安装完毕。
root@centos7 ~]# curl 192.168.0.17:9200
{
"name" : "NxlzYXo",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "1TIeg5apSsesAZsC4zQqTg",
"version" : {
"number" : "6.8.12",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "7a15d2a",
"build_date" : "2020-02-12T07:27:20.804867Z",
"build_snapshot" : false,
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
安装kibana
这个比较好安装了,rpm -ivh kibana-6.8.12-x86_64.rpm 或者yum install kibana-6.8.12-x86_64.rpm -y
vim /etc/kibana/kibana.yml #以下内容修改为:
server.port: 5601#可更改端口,前提是确保没被占用即可
server.host: "192.168.0.17"#指定kibana绑定的地址,安装在哪就写哪的IP,当然,现在是17
elasticsearch.hosts: ["http://192.168.0.17:9200"] #读取日志数据的接口,设为服务器地址,如果这里使用localhost,那么,会报错:server is not ready yet
i18n.locale: "zh-CN" #web界面更改为中文,英语比较好的同学不用改
- 服务的启动以及服务加入开机启动
systemctl enable kibana
systemctl start kibana &&systemctl status kibana#重点说一下,这个服务脚本不会当时报警(有错没错不知道,必须看下status,和k8s比较类似)
- kibana服务状态的验证
确保关闭了防火墙和selinux,别的任意一个浏览器,输入 192.168.0.17:5601,应该可以看到界面。
ln -s /usr/local/jdk/bin/java /usr/bin/,如果是使用脚本安装jdk的话,执行该命令
四、第二台机器的配置安装
- 安装nginx
我写的安装脚本,完全自动化
验证:关闭防火墙和selinux,打开局域网内任意浏览器,输入 192.168.0.18 可以看到NGINX的欢迎界面。
- 格式化NGINX日志格式为json
http {
include mime.types;
default_type application/octet-stream;
log_format log_json '{"@timestamp": "$time_local","user_ip":"$http_x_real_ip","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_req":"$request","http_code":"$status","body_bytes_sents":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}';
access_log /usr/local/nginx/logs/access.log log_json;#注意,这个路径是日志存放路径,别写错
打开NGINX的主配置文件,在http这一模块内添加log_format log_json这一长串对象,重启NGINX服务,
service nginx restart, 此时,访问192.168.0.18,应该刷新出新的日志,并且格式为json了。
- 安装filebeat
rpm -ivh filebeat-6.8.12-x86_64.rpm或者 yum install filebeat-6.8.12-x86_61.rpm -y
- filebeat的配置修改
[root@centos8 ~]# cat filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
host: "192.168.0.17:5601"
output.elasticsearch:
hosts: ["192.168.0.17:9200"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- 服务启动并加入开机启动
systemctl enable filebeat
systemctl start filebeat && systemctl status filebeat
- 验证filebeat服务
打开任意浏览器,输入 192.168.0.17:5601
依次点击管理---索引模式--创建索引模式
多访问几次 nginx以产生日志,点击kibana的日志,即可看到所产生的日志了。
总结
jdk建议使用yum安装的方式,否则会出现很多缺失JAVA_HOME环境的报错,此时,就需要软链接java执行程序到 /usr/bin/目录内。如果是使用logstash,指定JAVA_HOME会更麻烦些。
EFK和ELK的服务极为类似k8s的服务,启动后不显示成功与否,需要查看服务状态才可知道是否成功。
kibana的汉化看个人的英语水平,我反正基本不需要,对汉化的支持是6.5版本以后,如果没记错的话,因此,本次安装选择的是6.8.12版本。如果是后面修改的i18n.locale: "zh-CN",请重启kibana服务。