前言
收集和分析日志是应用开发中至关重要的一环,互联网大规模、分布式的特性决定了日志的源头越来越分散,
产生的速度越来越快,传统的手段和工具显得日益力不从心。在规模化场景下,grep、awk
无法快速发挥作用,我们需要一种高效、灵活的日志分析方式,可以给故障处理,问题定位提供更好的支持。基于全文搜索引擎 Lucene 构建的
ELKstack 平台,是目前比较流行的日志收集方解决方案。ELK系统的部署按照官方文档操作即可,相关资料也很多,这篇文章更多的关注三个组件的设计和实现,帮助大家了解这个流行的日志收集系统,
一:ELK统一日志系统
结合Logstash,ElasticSearch和Kibana三个组件,可以搭建一套高效的日志收集和分析系统。
1.1:ELK日志系统数据流图
ELK stack支持组件间的灵活组合,提供强大的开箱即用的日志收集和检索功能。
可以看到ELK系统进行日志收集的过程可以分为三个环节:
- 日志收集和导入ElasticSearch
- ElasticSearch进行索引等处理
- 可视化操作,查询等
Logstash可以结合Redis或者kafka等收集应用服务器产生的日志,经过简单的过滤等操作后发送到ElasticSearch,ElasticSearch进行相关的索引处理,最后在Kibana进行相关的可视化操作。
二:Logstash进行日志采集
Logstash 是一种功能强大的信息采集工具,类似于同样用于日志收集的 Flume。
Logstash通过配置文件规定 Logstash 如何处理各种类型的事件流,一般包含 input、filter、output 三个部分。
Logstash 为各个部分提供相应的插件,通过 input、filter、output 三类插件完成各种处理和转换,
另外 codec 类的插件可以放在 input 和 output 部分通过简单编码来简化处理过程。
2.1:Logstash架构
Logstash使用Jruby语言编写,对于使用者来讲,Logstash本身是基于命令行界面,面向任务处理的。
Logstash的软件架构是一种带有“管道-过滤器”风格的插件式架构,作为一个开源软件,Logstash遵循Apache 2.0
进行开源,第三方社区为其贡献了大量插件。
这张数据流图来自官方社区,可以看到Logstash的运行时数据处理会经历三个阶段:
- 输入阶段 接受不同来源的数据流入,可以配置codec插件进行简单的处理。
- 过滤阶段 对流入数据进行过滤等操作,传递给output,其中“输入”与“输出”是必须有的,“过滤”阶段是可选的。
- 输出阶段 将数据传递到消息队列,文件系统等进行进一步处理,在ELK的日志系统中,输出到ElasticSearch索引中。
三个阶段的处理任务是异步的,不存在跨阶段任务执行与同一个线程中的情况。
三:Kibana介绍
一个针对Elasticsearch的开源分析及可视化平台
搜索、查看存储在Elasticsearch索引中的数据
通过各种图表进行高级数据分析及展示
3.1:Kibana主要功能
Elasticsearch无缝之集成
整合数据,复杂数据分析
让更多团队成员受益
接口灵活,分享更容易
配置简单,可视化多数据源
简单数据导出
四:部署步骤
实验分配
系统 | 主机名 | IP地址 | 主要软件 |
---|---|---|---|
centos:7.6 | node1 | 20.0.0.45 | Elasticsearch |
centos:7.6 | node2 | 20.0.0.46 | Elasticsearch |
centos:7.6 | apache | 20.0.0.47 | Logstash,Apache |
centos:7.6 | kibana | 20.0.0.49 | Kibana |
4.1:在node1,node2上安装elasticsearch
- (操作相同,只演示一台)
#关闭防火墙
[root@node1 ~]# systemctl stop firewalld.service
[root@node1 ~]# setenforce 0 #关闭安全防护功能
[root@node1 ~]# vim /etc/hosts ##配置解析名
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
20.0.0.45 node1
20.0.0.46 node2
'//ping node2节点查看连接性'
[root@noed1 ~]# ping node2
PING node2 (20.0.0.46) 56(84) bytes of data.
64 bytes from node2 (20.0.0.46): icmp_seq=1 ttl=64 time=0.230 ms
64 bytes from node2 (20.0.0.46): icmp_seq=2 ttl=64 time=0.617 ms
.....省略信息.........
#验证java环境
安装java环境(java环境必须是1.8版本以上的)
[root@node1 ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
'//安装elasticsearch'
[root@node1 opt]# ls
elasticsearch-5.5.0.rpm rh
#安装
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
#加载系统服务
systemctl daemon-reload
systemctl enable elasticsearch.service
4.2:配置elasticsearch主配置文件
#备份一下
[root@node1 opt]# cp -p /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
'//下面的配置文件都要顶格写'
17//行 cluster.name: my-elk-cluster #群集名称
23//行 node.name: node1 #节点名称
33//行 path.data: /data/elk_data #数据存放路径 '//一会去创建'
37//行 path.logs: /var/log/elasticsearch #日志存放路径
43//行 bootstrap.memory_lock: false #不在启动的时候锁定内存
55//行 network.host: 0.0.0.0 #提供服务绑定的IP地址,0.0.0.0代表所有地址
59//行 http.port: 9200 #侦听端口为9200
68//行 discovery.zen.ping.unicast.hosts: ["node1", "node2"] #集群发现通过单播实现
#反向过滤查看配置的文件
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
'//仔细检查配置文件'
4.3:创建数据存放路径并授权
#创建数据存放点 刚刚在配置文件已经指向了
[root@node1 opt]# mkdir -p /data/elk_data
#设置权限
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/
- 启动elasticsearch是否成功开启
[root@node1 opt]# systemctl restart elasticsearch.service
[root@node1 opt]# systemctl stop firewalld
[root@node1 opt]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 88505/java
#这边的防火墙注意关闭
- 查看节点信息 用真机的浏览器打开 http://20.0.0.41:9200 有文件打开下面是节点的信息
- 访问node2节点
- 查看集群检查健康和状态
在真机浏览器打开20.0.0.42://20.0.0.45:9200/_cluster/health?pretty
- 查看节点状态信息
4.4:在node1,node2上安装node组件依赖包
#操作相同,只演示一个
[root@noed1 opt]# ls
elasticsearch-5.5.0.rpm node-v8.2.1.tar.gz rh
elasticsearch-head.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2
'//安装编译工具'
[root@node1 opt]# yum -y install gcc gcc-c++ make
'//解压缩'
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz
'//执行脚本文件'
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
'//编译及安装'
[root@node1 node-v8.2.1]# make -j3
[root@node1 node-v8.2.1]# make install
4.5:安装phantomjs前端框架
#上传安装包到/usr/local/src
[root@node1 opt]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
[root@noed1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/
'//复制文件便于系统所识别'
[root@noed1 bin]# cp phantomjs /usr/local/bin/
4.6:安装elasticsearch-head数据可视化管理工具
'//解压到/usr/local/src'
[root@node1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 opt]# cd /usr/local/src/
[root@node1 src]# cd elasticsearch-head/
'//安装'
[root@node1 elasticsearch-head]# npm install
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {
"os":"darwin","arch":"any"} (current: {
"os":"linux","arch":"x64"})
npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
up to date in 4.855s
- 修改elasticsearch主配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
'//末行插入'
#action.destructive_requires_name: true
http.cors.enabled: true #开启跨区域访问支持,默认为false
http.cors.allow-origin: "*" #跨域访问允许的域名地址
#重启服务
[root@node1 ~]# systemctl restart elasticsearch.service
- 启动elasticsearch-head
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start & //后台运行
[1] 4515
#启动服务
[root@node1 elasticsearch-head]# netstat -ntap | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 4525/grunt
[root@node1 elasticsearch-head]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 4398/java
- 在浏览器上连接并查看健康值状态
-
在Elasticsearch后面的栏中输入http://20.0.0.45:9200/
-
然后点击连接会发现:群集健康值:greep(0 of 0)
⭐node1信息动作
⚪node2信息动作
我们现在在node1节点创建索引
-
登录20.0.0.45 node1主机索引
-
索引为index-demo,类型为test,可以看到已成功创建
[root@node1 elasticsearch-head]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}
- 我们来查看一下
4.7:在Apache服务器上安装logstash,多elasticsearch进行对接
'//关闭防火墙跟安全防护功能'
[root@apache ~]# systemctl stop firewalld.service
[root@apache ~]# setenforce 0
'//安装apache服务'
[root@apache ~]# yum -y install httpd
'//启动服务'
[root@apache ~]# systemctl start httpd
#安装java环境 没有安装直接安装yum -y install java
[root@apache ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
#安装logstash
[root@apache ~]# rpm -ivh logstash-5.5.1.rpm
#开启服务
[root@apache ~]# systemctl start logstash.service
#设置开机自启动
[root@apache ~]# systemctl enable logstash.service
#建立logstash软连接便于系统所识别
[root@apache ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
logstash(Apache)与elasticsearch(noed)功能是否正常做对接测试
Logstash这个命令测试
字段描述解释:
-f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e 后面跟着字符串 该字符串可以被当作logstash的配置(如果是“ ”。则默认使用stdin作为输入、stdout作为输出
48:输入采用标准输入 输出采用标准输出–登录Apache服务器
[root@apache ~]# logstash -e 'input { stdin {} } output { stdout {} }'
...省略信息.....
The stdin plugin is now waiting for input:
19:46:30.779 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {
:port=>9600}
www.shuai.com '//标准输入'
2020-10-11T11:46:48.665Z appche www.shuai.com '//标准输出'
- 使用rubydebug显示详细输出,codec为一种编辑器
[root@apache ~]# logstash -e 'input { stdin {} } output { stdout { codec=>rubydebug } }'
...省略信息....
The stdin plugin is now waiting for input:
19:48:34.120 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {
:port=>9600}
www.niu.com
{
"@timestamp" => 2020-10-11T11:48:47.538Z, '//时间'
"@version" => "1", '//版本'
"host" => "appche", '//主机名'
"message" => "www.niu.com" '//输入的内容'
}
'//重启logstash服务'
[root@apache ~]# systemctl restart logstash.service
- 使logstash将信息写入到elasticsearch##输入 输出 对接
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["20.0.0.45"] } }'
....省略信息......
The stdin plugin is now waiting for input:
19:52:40.945 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {
:port=>9600}
www.shuai.com
- 登录20.0.0.45:9100查看输入信息
- 查看输入的数据
4.9:将系统日志文件输出到elasticsearch中
'//增加可读的权限'
[root@appche ~]# chmod o+r /var/log/messages
'//创建文件'
[root@appche ~]# vim /etc/logstash/conf.d/system.conf
input {
file{
'//对象'
path => "/var/log/messages" '//日志目录'
type => "system" '//索引类型'
start_position => "beginning" '//从头开始读写'
}
}
output {
elasticsearch {
hosts => ["20.0.0.45:9200"] '//指向node1地址'
index => "system-%{+YYYY.MM.dd}" '//建立索引 sytem开头 后面日期格式'
}
}
'//重启服务'
[root@appche ~]# systemctl restart logstash.service
-
打开浏览器 输入http://20.0.0.45:9100 查看索引信息
-
你会发现多出system-2020.10.11
五:新开一台节点服务器安装kibana
'//关闭防火墙跟安全防护功能'
[root@kibana ~]# systemctl stop firewalld.service
[root@kibana ~]# setenforce 0
'//下载kibana'
[root@kibana ~]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@kibana ~]# cd /etc/kibana/
'//备份一下'
[root@kibana kibana]# cp -p kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml ##修改配置文件
2//行 server.port: 5601 #kibana打开的端口
7//行 server.host: "0.0.0.0" #kibana侦听的地址
21//行 elasticsearch.url: "http://20.0.0.45:9200" #和elasticsearch建立联系
30//行 kibana.index: ".kibana" #在elasticsearch添加.kibana索引
'//启动kibana服务'
[root@kibana kibana]# systemctl start kibana.service
'//开机启动'
[root@kibana kibana]# systemctl enable kibana.service
'//查看端口'
[root@kibana kibana]# netstat -ntap | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 85268/node
- 访问kubana http://20.0.0.49:5601
5.1:如果我们想展示apache服务器对接的apache日志文件
5.11:统计对接apache日志文件
[root@appche ~]# vim /etc/logstash/conf.d/apache_log.conf
input {
file{
path => "/etc/httpd/logs/access_log" '//输入信息'
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
'//根据条件判断出信息'
elasticsearch {
hosts => ["20.0.0.45:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["20.0.0.45:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache ]# logstash -f /etc/logstash/conf.d/apache_log.conf
##根据配置文件配置logstach
5.12:访问网页信息,查看kibana统计情况
- 浏览器访问Apache服务
- 新生成access日志
##选择management>Index Patterns>create index patterns
##创建apache两个日志的信息
5.13:在kibana创建access访问日志
5.14:在kibana创建error访问日志
- 查看access日志统计情况
- 查看error统计情况
实验到此结束,感谢观看