一、概要
1、开发和测试环境查看日志有点麻烦,现在搭建一个ELK系统收集日志,方便查询和统计。每天所有开发、测试服务器的日志加起来200M左右,数据的准确性要求不是那么高,Logstash、Elasticsearch 单节点就够用了。
2、ELK是现在比较流行的日志收集解决方案,ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。
3、下载 https://www.elastic.co/cn/products
4、现在选择FileBeat => Logstash => Elasticsearch => Kibana 这套方案
5、以下内容的路径和IP根据实际情况修改。
二、安装及启动
1、采用tar包安装,版本filebeat-6.5.1-linux-x86_64.tar.gz、logstash-6.5.1.tar.gz、elasticsearch-6.5.1.tar.gz、kibana-6.5.1-linux-x86_64.tar.gz
2、elasticsearch安装在192.168.18.13的/home/es下面,配置文件在./config文件夹下,elasticsearch.yml一般修改path.data、path.logs、network.host就可以了
jvm.options根据实际情况修改,其他几个配置文件一般默认就可以。
然后 执行 ./elasticsearch -d,
注意:elasticsearch不能以root启动,useradd es,su es
启动是可能报错,需要修改一些配置文件,参考https://blog.csdn.net/yjclsx/article/details/81302041
关闭elasticsearch kill-9 (优雅的关闭方式待完善)
3、kibana安装在192.168.18.13的 /usr/local/kibana 下面,修改config文件夹下面的kibana.yml,一般只修改elasticsearch.url: "http://192.168.18.13:9200" 就可以了。
kibana和elasticsearch的ssl的认证没有打开
启动:nohup ./bin/kibana &
关闭:kill -9 (优雅的起停服务待完善)
3、logstash安装在192.168.18.13的 /usr/local/logstash 文件夹下,修改logstash-sample.conf,elasticsearch.hosts = 192.168.18.13:9200,然后增加filter(具体根据业务需求)
启动nohup ./bin/logstash -f ./config/logstash-sample.conf &
注意:./bin/logstash -t ./config/logstash-sample.conf是测试配置文件,默认的配置文件测试时会报错的,但是可以启动(具体原因没查,可能test写的有问题)
需要配置 date { match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss" ]} 要不然查到的都是增加了8小时的数据(时区原因,时间timestamp字段会默认增加8小时)
根据我们的业务需求修改 ./vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/java(以下是根据项目的实际情况做的新增、修改)
新增:BTBS_LOG_LEVEL (INFO|DEBUG|ERROR|WARN|TRACE)
新增:BTBS_TOMCAT_DATESTAMP %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}:?%{SECOND}
新增:BTBS_TOMCATLOG %{BTBS_TOMCAT_DATESTAMP:btbs_timestamp} %{BTBS_LOG_LEVEL:level}
坑:不能使用timestamp(btbs_timestamp),timestamp是系统默认的字段,配置之后正则可能无法生效
multiline功能filebeat已有,logstash无需安装该插件
4、filebeat安装在每台需要收集日志的机器上,统一安装在:/work/filebeat ,修改 filebeat.yml
filebeat.inputs.enabled: true、filebeat.inputs.enabled.paths: - /var/log/btbs/*/main.log 、multiline.pattern: ^[^\d] 、multiline.match: after
注释 output.elasticsearch 相关配置
打开 output.logstash:hosts: ["192.168.18.13:5044"]
filebeat与logstash的ssl认证没有打开
启动:nohup ./filebeat -e -c filebeat.yml &
关闭:kill -9 (优雅的起停服务待完善)
5、 因为elasticsearch是安装在内网,公网服务器无法访问,而且公网是非固定IP(如果elasticsearch在公网,这条不用关心)
增加端口映射。把公网的5044端口映射到192.168.13的5044端口上
在192.168.18.10增加/home/work/task/filebeat-config-task.sh,并添加到crontab定时任务,每5分钟执行一次,该脚本会判断公网IP是否改变,如果改变则会执行远程的/work/filebeat/start-filebeat.sh脚本
在各filebeat节点的/work/filebeat/下增加 start-filebeat.sh
在192.168.18.10的jnekins上增加任务start-one-filebeat,可以手动执行远程的/work/filebeat/start-filebeat.sh脚本
filebeat-config-task.sh
#!/bin/bash
remote_ip_arr=("100.137.151.11" "135.110.67.67")
myip=$(wget -qO - ifconfig.co)
ipconfig="$(cat /home/es/task/ip-address.conf)"
last_ip="${ipconfig[0]}"
if [ "$last_ip" != "$myip" ]
then
remote_shell='/work/filebeat/start-filebeat.sh '$myip
for remote_ip in ${remote_ip_arr[@]}
do
ssh root@${remote_ip} $remote_shell
done
echo "$myip" > /home/es/task/ip-address.conf
else
echo 'same ip'
fi
start-filebeat.sh
#!/bin/bash
ip_address=$1
param="output.logstash.hosts=["$ip_address:5044"]"
pid=$(ps -ef|grep 'filebeat -e'|grep -v 'grep'|awk '{print $2}')
echo $pid
if [ -n "$pid" ]; then
kill -9 $pid
sleep 1
fi
cd /work/filebeat/
echo "$param"
nohup ./filebeat -e -E "$param" >/dev/null 2>&1 &