纯本地搭建 EFK 管理远程服务器日志
项目staging环境日志难以搜索,计划搭建EFK管理日志,但是EFK内存消耗太大,再新增云服务器不划算,打算搭建在本地(16G内存)。
什么是 EFK
EFK不是一个软件,而是一套解决方案,并且都是开源软件,其中 ELasticsearch
负责日志保存和搜索,FileBeat
负责收集日志,Kibana
负责界面。
- Elasticsearch
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 - FileBeat
Filebeat 隶属于 Beats,搜集日志数据并上载到Elasticsearch
、Logstash
、Redis
等平台。 - Kibana
Kibana 提供日志分析的友好 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
环境现状
- 本地环境:Windows 10,Intel(R) Core(TM) i5-7500 CPU,内存 16G
- 远程环境:SUSE Linux Enterprise Server 11,可用内存不足 1G
- 本地可以启虚拟机,但没钱买额外的云服务器。
最初想法
目前有3种思路:
- 本地启动Elasticsearch、Kibana、Filebeat,服务器启动FTP,并映射到本地网络驱动器,Filebeat配置从网络驱动器读取log。
- 本地启动Elasticsearch、Kibana,用反向代理工具FRP暴露Elasticsearch的9200端口到公网(注意配置鉴权),远程启动Filebeat,输出到本地的Elasticsearch。
- 本地启动Elasticsearch、Kibana,Logstash,远程启动Filebeat、Redis,远程的Filebeat输出到Redis,本地的Logstash从Redis上读取,转发给Elasticsearch。
方案确定
以上的三种方案都存在阻力:
- 不能稳定映射,经常断开,且I/O速度太慢
- 反向代理工具不能在公司中使用
- 配置较复杂
睡一觉之后产生了第4种方案:
4. 本地启动Elasticsearch、Kibana、Filebeat,循环执行rsync命令,SSH连接到服务器并把log增量同步到本地,本地Filebeat就可以畅快地读取了
动手搭建
Elasticsearch、Kibana由于资源消耗大,决定在Windows环境下启动
rsync 由于是 Linux 下的,只能在虚拟 Ubuntu 下启动
Filebeat 由于 log 在 Ubuntu 下,为了I/O效率,也在 Ubuntu 下启动
启动 E & K
安装 Kibana
https://www.elastic.co/guide/en/kibana/current/windows.html
安装 Elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-install.html
请参考官方安装文档进行安装,本教程所用配置如下:
1 | network.host: [_local_, _site_] |
1 | server.port: 5601 |
启动虚拟机
这里使用Vagrant启动,安装Virtualbox和Vagrant,创建Vagrantfile如下
1 | Vagrant.configure("2") do |config| |
同目录下执行 vagrant up
,然后 vagrant ssh
连接上虚拟机。
启动 Filebeat
安装Filebeat
1 | curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-amd64.deb |
配置Filebeat
1 | sudo vim /etc/filebeat/filebeat.yml |
这是common的配置,请按照自己项目的log格式配置相应的插件。10.0.2.2
代表宿主机,如果你用的也是Virtualbox + Vagrant,不要改动。
1 | filebeat.inputs: |
确保前面已经启动Elasticsearch和Kibana,然后启动Filebeat,sudo service filebeat start
从server端增量同步log
首先服务器必须开启ssh_key登录,在Ubuntu下生成ssh配置到服务器的 authorized_keys
中。
执行 byobu
,这会开一个终端 session,在此执行的命令不会因为终端退出而终止。
快捷键 | 作用 |
---|---|
F2 | 新建一个窗口 |
F3 | 切换到上一个窗口 |
F4 | 切换到上一个窗口 |
F7 | 浏览当前窗口的历史打印信息 |
F6 | 让 byobu 到后台去 |
Ctrl + F6 | 关闭当前窗口 |
修改以下命令,并执行实现增量同步:
1 | while true;do rsync -rtv --include "**.log" --exclude "*.*" --append -e "ssh -p <服务器SSH端口号>" <服务器登录用户名>@<服务器地址>:/var/logs /home/vagrant;sleep 5;done; |
这个命令很长,所以给出命令解释:
while true
循环执行-rtv
r代表递归目录,t代表保留待同步文件的修改时间,v代表啰嗦模式,输出更多同步信息(可以-vv更啰嗦模式)--include "**.log" --exclude "*.*"
只同步log文件--append
增量同步,会比较文件大小,只同步多出来的部分-e "ssh -p <服务器SSH端口号>"
自定义SSH程序命令行,自定义端口/var/logs /home/vagrant
同步服务器的 /var/logs 目录到本地的 /home/vagrant 下sleep 5
同步每次结束后休息5秒,避免过多占用服务器带宽
有兴趣的童鞋可以到这里学习rsync命令的更多用法:
https://www.cnblogs.com/f-ck-need-u/p/7221713.html
撒花
按F6把循环进程切到后台,稍等片刻后访问 http://localhost:5601/,看看能否查询到 log 了
如果历史log量很大,首次启动后会处理大量的log,短时间内查出大量的log是正常现象。
纯本地搭建 EFK 管理远程服务器日志