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

如果历史log量很大,首次启动后会处理大量的log,短时间内查出大量的log是正常现象。