介绍
日常维护运行在集群上的服务时,依次登录到机器上查看日志文件显然是非常低效的。另一方面,这些日志文件经常是有着良好的格式以及固定的路径。如果能将指定的日志文件批量导出到一个数据库里,无论是查看还是检索都会方便很多。这里记录一下在构建日志管理系统时的一些工具和方法,方便以后取用。
本文将构建的系统如下面的框图所示,用于管理日志文件(例如.log文件),并可以通过可视化工具Kibana显示、查找。
整个系统全部使用Elastic家族的服务,包括日志监控/读取服务Filebeat,数据管线Logstash,弹性存储和搜索服务Elasticsearch,以及最终的可视化工具Kibana。其中,Logstash是可选的,Filebeat也支持直接注入数据到Elasticsearch中,它存在的意义在于对日志进行一次filter处理,减轻Elasticsearch上的存储压力。
为了便于操作,本文整个系统都在一台电脑上实现。实际应用中,各个服务可能搭建在不同的机器上,服务之间通过网络通讯。但是原理都是一致的。
安装
这次用到的Elastic全家桶可以用homebrew安装,非常方便。
brew tap elastic/tap
brew install elastic/tap/elasticsearch-full
brew install elastic/tap/filebeat-full
brew install elastic/tap/logstash-full
brew install elastic/tap/kibana-full
其中,Logstash需要java支持,而且必须是java8或java11。可以用brew安装:
brew cask install homebrew/cask-versions/adoptopenjdk8
也可以自己前往oracle官网下载安装。
以上安装完成后,运行
brew services list
如果看到
Name Status User Plist
elasticsearch-full stopped
filebeat-full stopped
kibana-full stopped
logstash-full stopped
则证明安装成功了。稍后配置完成后,我们再回头启动这些service。
配置路径
这次用到了一共4个服务,这些服务的配置、日志等路径都不一样,整理如下。需要注意的是,本文是用brew安装在mac上的,在其他系统上路径结构可能会不一样。
服务 | 安装路径 | 配置路径 | 日志路径 |
Filebeat | /usr/local/var/homebrew/linked/filebeat-full/ | /usr/local/etc/filebeat | /usr/local/var/log/filebeat |
Logstash | /usr/local/var/homebrew/linked/logstash-full | /usr/local/Cellar/logstash-full/7.2.0/libexec/config/pipelines.yml (其他配置路径均在pipelines.yml中指定) | /usr/local/var/log/logstash.log |
Elasticsearch | /usr/local/var/homebrew/linked/elasticsearch-full | (ES_PATH_CONF) /usr/local/etc/elasticsearch | (path.logs) /usr/local/var/log/elasticsearch |
其中,Logstash的路径可能比较难找,Filebeat和Elasticsearch的路径在官方文档中都有详细的说明。
配置和测试
配置过程主要是根据数据流水线设置前后的输入输出。在这里所有的服务都是用端口链接,这是因为正常情况下这些服务是分布在不同机器上的。而我们作为测试全部放在一台机器上配置。
Filebeat
Filebeat的功能是监控log文件,并将更新的日志信息输出。
打开Filebeat的配置文件,brew安装的路径是 /usr/local/etc/filebeat/filebeat.yml
在Filebeat.inputs项下面配置需要监控的日志路径:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
将output下面的elasticsearch output注释掉,因为我们这里filebeat的下游是logstash,logstash的下游才是elasticsearch:
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
然后取消logstash下面的两行注释:
output.logstash:
hosts: ["localhost:5044"]
这样算是将Filebeat配好了。
对Filebeat的测试需要启动Filebeat服务之后才能看到。Filebeat的log在 /usr/local/var/log/filebeat/filebeat里,如果Filebeat正常的话,启动服务后可以在这个文件里看到时间戳和运行信息。
Logstash
Logstash的输入时Filebeat输出的日志信息,输出端是Elasticsearch。Logstash存在的意义在于,它可以添加filter对数据进行一波处理。
Logstash安装好就可以直接在命令行运行,并进行测试:
cd /usr/local/Cellar/logstash-full/7.2.0
bin/logstash -e 'input { stdin { } } output { stdout {} }'
该命令的意思是,直接用指定的配置启动Logstash。而这个配置的将输入输出全部绑定到标准流。
Logstash启动后,在命令行输入
hello logstash
会看到Logstash的输出
{
"host" => "yujinshiairbnb.local",
"@timestamp" => 2019-07-23T08:54:16.665Z,
"message" => "hello logstash",
"@version" => "1"
}
这样表示Logstash可以正常运行了。
对Logstash的配置比较复杂,首先要配置pipeline,配置文件的路径在
/usr/local/Cellar/logstash-full/7.2.0/libexec/config/pipelines.yml
比如配置一条test流水线,config文件指向另外一个地方:
- pipeline.id: test
path.config: "/usr/local/Cellar/logstash-full/7.2.0/libexec/config/logstash.conf"
pipeline.workers: 1
更多关于流水线的参数的设置可以参考官方文档。
conf文件如下配置:
input {
beats {
port => "5044"
}
}
filter {
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
这样一条简单的输入输出流水线就算配置好了。
Elasticsearch
Elasticsearch的作用是保存输入的日志,相关的有三个不同作用的配置文件,分别为:
- elasticsearch.yml Elasticsearch的配置文件
- jvm.options 配置JVM设置
- log4j2.properties 配置Elasticsearch的日志信息
这里保持默认配置即可,不需要修改。
Kibana
Kibana配置也不需要修改,直接启动然后从网页端配置即可。
启动
使用brew管理服务:
sudo brew services elasticsearch-full
sudo brew services filebeat-full
sudo brew services logstash-full
sudo brew services kibana-full
启动之后,可以用brew services list命令看到这些服务都是运行状态。
各个服务的日志可以去相应的路径查看。
Kibana界面配置
所有的服务都启动以后,Kibana已经在本地的5601端口(默认)启动了。因此访问
http://localhost:5601
即可打开Kibana网页。
第一次进入需要稍微配置一下,主要是配置Kibana从Elasticsearch读取的内容。
进入主页后如下图所示。
点击主页上的"connect to your Elasticsearch index",配置index pattern:
index pattern即从Elasticsearch中读取的日志的pattern,如上图中列出了一个indices为”logstash-2019.07.24-000001",意思是2019.07.24创建的Logstash。如果这里没有indices,可能是上游某个服务没有配好,应该回去查看前面各个环节的日志,确保没有error。
输入一个index pattern匹配该indices:
logstash-*
创建好index pattern之后,点击左侧栏的第一项“explorer”:
这个页面即可看到Filebeat收集到的日志信息。如果这里为空,可能是当前时间段没有新的日志,可以尝试修改filter的时间段。
到此,整个系统就搭好了。更多深入的探究,可以参考官方的说明文档。