关于elk这方面的介绍我这边就不多说了,之前有过介绍。我这篇文章为了应对目前我们这个公司业务量不大情况而搭建的日志收集系统。
官网链接https://www.elastic.co
安装docker我这里及不说了
从官网拉取elasticsearch镜像
[root@devon ~]# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.1
[root@devon ~]# docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.3.1
拉取kibana镜像
[root@devon ~]# docker pull docker.elastic.co/kibana/kibana:7.3.1
启动
[root@devon ~]# docker run --name kibana -d -p 5601:5601 -e ELASTICSEARCH_HOSTS=http://192.168.10.8:9200 kibana:7.3.1
[root@devon ~]# docker run --name kibana -d -p 5601:5601 -e ELASTICSEARCH_HOSTS=http://192.168.10.8:9200 kibana:7.3.1
0e07e9d646fe3e0786e434d2b97a813dac9c17cbd2ea664e0e5151dc4c4d4417
[root@devon ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
0e07e9d646fe kibana:7.3.1 "/usr/local/bin/du..." 8 seconds ago Up 7 seconds
400f07c09c01 docker.elastic.co/elasticsearch/elasticsearch:7.3.1 "/usr/local/bin/do..." 6 hours ago Up 6 hours
访问kibana IP+5601
下面我们就利用filebeat收集日志吧
[root@devon ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz
[root@devon ~]# tar -zxf filebeat-6.2.4-linux-x86_64.tar.gz -C /data/
[root@devon ~]# mv /data/filebeat-6.2.4-linux-x86_64/ /data/filebeat-6.2.4
[root@devon ~]# vim /data/filebeat-6.2.4/filebeat.yml
怎么利用filebeat设置多个索引,方便查询日志呢,我选择自定义的filebeat.yml文件
下面是我简单的收集的三个Java服务的日志。也可以更改默认模板,如果安装了logstash,格式需要修改,分析日志的格式一般由开发定。他们若有特殊要求格式,就另有他们便也json格式文件或者其他格式。
filebeat.prospectors:
- input_type: log
paths:
- /var/java/ivy-byways-service/logs/catalina.out
fields:
type: "byways"
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
- input_type: log
paths:
- /var/java/ivy-gotobus-hotels-web/logs/catalina.out
fields:
type: "gotobus"
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
- input_type: log
paths:
- /var/java/ivy-hotels-service/logs/catalina.out
fields:
type: "hotels"
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
- input_type: log
paths:
- /var/java/ivy-newsletter-service/logs/catalina.out
fields:
type: "newsletter"
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
- input_type: log
paths:
- /var/java/ivy-taketours-hotels-web/logs/catalina.out
fields:
type: "taketours"
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
#json.message_key: log
#json.keys_under_root: true
output.elasticsearch:
hosts: ["172.31.60.50:9200"]
#index: "logs-%{[beat.version]}-%{+yyyy.MM.dd}"
indices:
- index: "byways-service-log"
when.equals:
fields.type: "byways"
- index: "gotobus-hotels-web-log"
when.equals:
fields.type: "gotobus"
- index: "hotels-service-log"
when.equals:
fields.type: "hotels"
- index: "newsletter-service-log"
when.equals:
fields.type: "newsletter"
- index: "taketours-hotels-web-log"
when.equals:
fields.type: "taketours"
filebeat.yml,就是filebeat的主配置文件
打开文件,搜索multiline:,默认是注释的,常用的有如下三个配置:
multiline:
pattern: '^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]'
negate: true
match: after
上面配置的意思是:不以时间格式开头的行都合并到上一行的末尾(正则写的不好,忽略忽略)
pattern:正则表达式
negate:true 或 false;默认是false,匹配pattern的行合并到上一行;true,不匹配pattern的行合并到上一行
match:after 或 before,合并到上一行的末尾或开头
还有更多两个配置,默认也是注释的,没特殊要求可以不管它
max_lines: 500
timeout: 5s
max_lines:合并最大行,默认500
timeout:一次合并事件的超时时间,默认5s,防止合并消耗太多时间甚至卡死
然后如果我们有利用elasticsearch-head插件来管理集群的话我们可以看到
elasticsearch-head默认9100端口,为了避免端口发生冲突我就更改了下。如果线上的话,也没必要用这个管理。看自己的需求吧。
利用kibana和elasticsearch索引关联
其上面的图是我6.8.2版本的kinbana,到现在的7.3.1几乎没有差别
下面我们就来创建可视化图形吧。
7.3.1版本创建图表发生一点变化。
可以根据自己的需求来创建不同样式的图表,这里我就先创建line图表
点击你想创建的索引
至于kibana其他功能就自己探讨喽,
如果这样的架构满足不了也可以换成elk+kafaka+zookeeper等等
如果是集群模式的可以介绍两个管理集群的插件。
cerebo是kopf在es5上的替代者,通过web界面来管理和监控elasticsearch集群状态信息
bigdesk 统计分析和图表化elasticsearch集群状态信息
如果不删除ES数据,将会导致ES存储的数据越来越多,磁盘满了之后将无法写入新的数据。这时可以使用脚本定时删除过期数据。
#/bin/bash
#es-index-clear
#只保留7天内的日志索引
LAST_DATA=`date -d "-7 days" "+%Y.%m.%d"`
#删除上个月份所有的索引
curl -XDELETE 'http://ip:port/*-'${LAST_DATA}'*'
可以视个人情况调整保留的天数,这里的ip和port同样设置为不存储数据的那台机器。该脚本只需要在ES中一台机器定时运行即可。然后再调用crontab
crontab -e添加定时任务:
0 1 * * * /root/cron/del_es.sh
每天的凌晨一点清除索引。
也可以把es-index-clear.sh内容换成其它优秀代码,如下:
#!/bin/bash
###################################
#删除早于十天的ES集群的索引
###################################
function delete_indices() {
comp_date=`date -d "10 day ago" +"%Y-%m-%d"`
date1="$1 00:00:00"
date2="$comp_date 00:00:00"
t1=`date -d "$date1" +%s`
t2=`date -d "$date2" +%s`
if [ $t1 -le $t2 ]; then
echo "$1时间早于$comp_date,进行索引删除"
#转换一下格式,将类似2017-10-01格式转化为2017.10.01
format_date=`echo $1| sed 's/-/\./g'`
curl -XDELETE http://127.0.0.1:9200/*$format_date
fi
}
curl -XGET http://127.0.0.1:9200/_cat/indices | awk -F" " '{print $3}' | awk -F"-" '{print $NF}' | egrep "[0-9]*\.[0-9]*\.[0-9]*" | sort | uniq | sed 's/\./-/g' | while read LINE
do
#调用索引删除函数
delete_indices $LINE
done
下面这两个脚本是在网上借鉴的,欢迎大家一起学习研究。