在上一节实验中,我们已经搭建好了基本的软件环境,但是这离我们成功获取日志并进行分析和可视化还有很长的路要走。
在上一节中初步介绍了一套完整的 ELK 技术栈结构,要一次性部署完这套日志分析系统的各个组件,是比较困难的。这里我们将架构进行简化,结果如下图所示:
配置Logstash
Logstash 是打通日志文件和 Elasticsearch 之间的一个枢纽。和各种服务一样,Logstash 也有着自己的一套配置规则。
Logstash 的配置主要分为三大部分:input
, filter
, output
。
在讲解 Logstash 之前,我们先在 Logstash 目录下执行如下命令:
$ cd logstash-7.4.1/bin
# 测试,`-e` 参数表示立即执行
$ ./logstash -e 'input { stdin { } } output { stdout {codec=>json} }'
这时,终端会等待输入,我们可以简单的输入 hello shiyanlou
这时会看到有如下输出:
执行过程可能比较慢,需要耐心等待一会儿:
使用
ctrl+c
关闭当前 Logstash 执行的配置。
配置语法
我们先来观察刚才命令中的字符串:
'input { stdin { } } output { stdout {codec=>json} }'
将其格式化后:
input {
stdin {}
}
output {
stdout {
codec => json
}
}
其中,stdin {}
表示标准输入,stdout {}
表示标准输出,在这个字符串中,其实定义了 Logstash 的两个行为 input
和 output
。
在 input
中,我们定义了一个标准输入,由于什么都没有,所以 Logstash 会从终端的标准输入中读取字符串,这也是为什么刚才在输入完命令后会出现等待输入的情况。
在 output
中,我们定义了一个标准输出,也就是说 Logstash 在处理完后会将结果从标准输出(终端)中输出,而 codec
字段,则说明了输出会遵循什么样的格式,这里定义的 codec
为 json
,所以我们刚才看到了一套标准的输出格式。
有了对 Logstash 配置语法的基本认识,我们可以开始配置从 Log 到 Logstash 再到 Elasticsearch 的配置文件了。
配置 Log->Logstash->Elasticsearch
由于 Logstash 的配置很长,所以我们不太可能在一行命令中把整个配置写好,所以我们可以提前创建 Logstash 配置文件:
cd /home/shiyanlou/logstash-7.4.1
mkdir conf.d && cd conf.d
touch logstash-shipper.conf
我们现在要将日志文件作为输入,将日志分析系统elasticsearch
作为输出
input {
stdin {}
file {
path => "/home/shiyanlou/Code/elk/access.log"
start_position => "beginning"
codec => multiline {
negate => true
pattern => '^\d'
what => 'previous'
}
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
在这份配置中,我们加入了文件输入的配置,加入了 elaticsearch 分析系统的输入。 我们将 input
定义加入 file
(文件)输入,并设置 start_position
从第一行开始,保证能够导入旧数据。 输出,此种举动一方面可以方便我们日后进行调试,另一方面可以将其作为 Logstash 的日志进行输出。
而 elasticsearch
则给出了向 elasticsearch
输入数据的申明。
执行命令检测配置文件是否正确:
cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf --config.test_and_exit
--config.test_and_exit 选项表示检测配置文件并报告错误(只是检测,不会真正执行)
需要等待一会儿执行完成:
配置没问题后,还是上面那条命令,去掉 --config.test_and_exit
选项,再次执行:
cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf
等待一会儿执行完成:
此时 Logstash 运行在前台,如果使用快捷键 ctrl+c
就会结束当前进程,Logstash 就不会向 Elasticsearch 发送数据。
配置Kibana
在前面的实验中,我们运行 Logstash:
cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf
可以不断地搜集 Nginx 访问日志信息,并发送到 Elasticsearch。我们可以在浏览器中,通过 Kibana 查看这些日志数据。
输入地址:localhost:5601
就可以访问首页:
点击 Management -> Kibana 下方的 Index Patterns -> Create index pattern:
在 Index pattern 中填写 logstash-*
,然后点击 Next step:
然后需要配置一个索引模式,这里可以直接使用默认索引模式 @timestamp
,然后点击 Create index pattern:
可以看到,Kibana 默认为我们创建了 16 个字段(fields):
点击左侧边栏的 Discover ,进入到 Kibana 的全局搜索界面,这个时候还没有任何的统计数据:
浏览器访问 nginx 首页,地址:localhost,可以尝试多刷新几次页面:
然后切换到 Kibana 页面并刷新可以看到更多统计信息:
右上角可以选择数据记录的时间段:
KIbana 具有丰富的图表工具,能够以多种方式来分析数据,我们将尝试使用图表来分析每分钟 nginx 日志记录。
可以看到这里自动为我们创建好了面积图:
右侧即是面积图,Y 轴代表 nginx 日志的请求总数(Count),可以看到有 7 条记录。X 代表分钟间隔,从这个表中,可以很直观地看出 Nginx 每半分钟(30 秒)日志记录数量,以及变化趋势。从而可以判断当前 Nginx 的负载情况。
如果数据较少,可以向 access.log 中添加伪造数据,或者多次刷新 nginx 页面
也可以通过左边的选项自定义数据类型:
X 轴的配置指标:
Aggressive:Date Histogram 。表示聚合方式为日期直方图。
Field:@timestamp 。字段为 @timestamp
。
Minimum Interval:Auto 。系统自动设置时间。
Kibana 也支持将统计结果保存,以便于下次快速查看最新统计结果。点击左上角的 Save 按钮,输入保存的名字,点击保存即可:
下次再打开 Visualize 时,就可以看到保存的记录,就可以快速查看统计情况:
如果你保存了多个可视化数据时,你可以创建一个 Dashboard,以便于可以快速查看全部统计数据:
创建新的 Dashboard:
添加已保存的统计图表数据:
我们刚才保存的 Nginx logs1
:
Nginx logs1 的统计图表添加到了下方面板:
Redis作为缓冲区
Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。Redis 提供了一个很好的缓冲区,它能够很好地帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,从而使用 Redis 对数据的产生和使用进行了分层。
修改配置文件,将 Logstash 的 input 设置为 Redis,从 Redis 中读取日志数据,进入 /home/shiyanlou/logstash-7.4.1
:
cd /home/shiyanlou/logstash-7.4.1
mkdir conf.d && cd conf.d
vim logstash-indexer.conf
添加以下内容:
input {
redis {
host => "localhost"
type => "redis"
data_type => "list"
key => "logstash"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts=>["localhost:9200"]
index=>"logstash-%{+YYYY.MM.dd}"
}
}
配置 Logstash 的 output 为 Redis,将日志数据输出到 Redis,编辑 logstash-shipper.conf
:
vim /home/shiyanlou/logstash-7.4.1/conf.d/logstash-shipper.conf
向文件中写入如下代码:
input {
stdin {}
file {
path => "/home/shiyanlou/Code/elk/access.log"
start_position => beginning
codec => multiline {
negate => true
pattern => '^\d'
what => 'previous'
}
}
}
output {
stdout {
codec => rubydebug
}
redis {
host => "localhost"
data_type => "list"
key => "logstash"
}
}
打开两个终端页面:一个模拟 Slave Node 的 Logstash 进程,一个模拟 Master Node 的 Logstash 进程。
启动 Shipper 进程,指定配置文件为 logstash-shipper.conf
:
cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf
在另一个终端启动 Indexer 进程,指定配置文件为 logstash-indexer.conf
:
mkdir -p /home/shiyanlou/data/logstash
cd logstash-7.4.1
bin/logstash -f conf.d/logstash-indexer.conf --path.data /home/shiyanlou/data/logstash
在同一台主机上启动多个 logstash 进程需要将它们的数据目录分开,这里通过
--path.data
选项给第二个进程分配了一个单独的目录。
在 Shipper 中输入数据:hello shiyanlou
:
然后可以在 Indexer 中看到对应的输出:
所以 Indexer 进程也会接收到新产生的数据。这个过程中,Shipper 产生数据,输入到 Redis 队列中,Indexer 从 Redis 中读取新的数据。在集群环境中,可以将 Shipper 进程部署到各个节点服务器,只需要在 master 节点服务器上部署 Indexer 即可管理全部日志信息