场景:1)datasource->logstash->elasticsearch->kibana2)datasource->filebeat->logstas
场景:
1) datasource->logstash->elasticsearch->kibana
2) datasource->filebeat->logstash-> elasticsearch->kibana
3) datasource->filebeat->logstash->redis/kafka->logstash-> elasticsearch->kibana
4) kafka->logstash-> elasticsearch->kibana
5) datasource->filebeat->kafka->logstash->elasticsearch->kibana(最常用)
6) filebeatSSL加密传输
7) datasource->logstash->redis/kafka->logstash->elasticsearch->kibana
8) mysql->logstash->elasticsearch->kibana
上述主要是对下面传输处理场景的一个概括,从数据源开始,如何采集,用什么工具采集,采集到哪里,经过怎样的处理过滤,传输到哪里,怎样进行展示
输入、输出、过滤主要通过插件实现(包含多类型插件),插件教程参考官网
https://www.elastic.co/guide/en/logstash/current/index.html
【安装部署这种官网或者社区已经很完善,此处不做赘述,可自行去官网查看】
ps【redis集群安装文档前面已经说明过,可自行查看】
前提条件
1) java环境:jdk8;
2) elk已搭建完毕;
3) elasticsearch、kibana、logstash版本最好保持一致,目前环境是5.6.10版本
4) logstash建议使用root用户(拥有足够权限去搜集所需日志文件);
5) elasticsearch使用普通用户安装,新版本已限制不允许root安装;
6) filebeat安装完毕
启动命令:
7) logstash启动命令:
nohup ./bin/logstash -f ***.conf –config.reload.automatic >/dev/null 2>/dev/null &
8) filebeat启动命令: nohup ./filebeat -e -c filebeat.yml>/dev/null 2>/dev/null &
9)elasticsearch启动命令:./elasticsearch -d
10)kibana启动命令:nohup ./bin/kibana &
Logstash启动命令:--config.reload.automatic自动重新加载配置文件,无需重启logstash
filebeat启动命令:-e参数指定输出日志到stderr,-c参数指定配置文件路径
场景介绍
一、 简单模式:以logstash作为日志搜索器
架构:logstash采集、处理、转发到elasticsearch存储,在kibana进行展示
特点:这种结构因为需要在各个服务器上部署 Logstash,而它比较消耗 CPU 和内存资源,所以比较适合计算资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作。
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
经过grok正则分析后:
"clientip" => "192.168.80.183", "timestamp" => "04/Jan/2018:05:13:42 +0000", "verb" => "GET", "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png", "referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"", "response" => "200", "bytes" => "203023", "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"", |
示例三(自定义grok表达式mypattern[A-Z]):
filter { grok{ match=>{ "message"=>"%{IP:clientip}\s+(?[A-Z]+)"} } } |
初始输入message:
经过grok正则分析后:
"clientip" => "12.12.12.12", "mypattern" => "ABC" |
示例四(移除重复字段):
filter { grok { #match => { "message" => "%{COMBINEDAPACHELOG}"} match => { "message" => "%{IP:clientip}\s+%{IP:clientip1}"} } mutate { remove_field => ["message"] remove_field => ["host"] } } |
初始输入message:
经过grok正则解析后(json格式):
{ "_index": "logstash-2018.07.31", "_type": "log", "_id": "AWTuNdzp6Wkp4mVEj3Fh", "_version": 1, "_score": null, "_source": { "@timestamp": "2018-07-31T02:41:00.014Z", "offset": 1114, "clientip": "1.1.1.1", "@version": "1", "input_type": "log", "beat": { "name": "node183", "hostname": "node183", "version": "5.6.10" }, "source": "/home/usieip/bdp-datashare/logs/a.log", "type": "log", "clientip1": "2.2.2.2", "tags": [ "beats_input_codec_plain_applied" ] }, "fields": { "@timestamp": [ 1533004860014 ] }, "sort": [ 1533004860014 ] } |
示例五(过滤筛选catalina.out文件中的信息,message字段已移除):
filter { grok { match => { "message" => "%{DATA:ymd} %{DATA:sfm} %{DATA:http} %{DATA:info} %{GREEDYDATA:index}"} } } |
【Data在pattern中的定义是:.*? GREEDYDATA在pattern中的定义是:.*】
初始输入message:
2018-07-30 17:04:31.317 [http-bio-8080-exec-19] INFO c.u.i.b.m.s.i.LogInterceptor - ViewName: modules/datashare/front/index |
经过grok正则解析后(截图及json格式如下):
{ "_index": "logstash-2018.07.31", "_type": "log", "_id": "AWTvhiPD6Wkp4mVEj3GU", "_version": 1, "_score": null, "_source": { "offset": 125, "input_type": "log", "index": "c.u.i.b.m.s.i.LogInterceptor - ViewName: modules/datashare/front/index", "source": "/home/usieip/bdp-datashare/logs/b.log", "type": "log", "tags": [], "ymd": "2018-07-30", "@timestamp": "2018-07-31T08:48:17.948Z", "@version": "1", "beat": { "name": "node183", "hostname": "node183", "version": "5.6.10" }, "http": "[http-bio-8080-exec-19]", "sfm": "17:04:31.317", "info": "INFO" }, "fields": { "ymd": [ 1532908800000 ], "@timestamp": [ 1533026897948 ] }, "sort": [ 1533026897948 ] } |
常用参数:
1)match:match作用:用来对字段的模式进行匹配
2)patterns_dir:用来指定规则的匹配路径,如果使用logstash自定义的规则时,不需要写此参数。Patterns_dir可以同时制定多个存放过滤规则的目录;
patterns_dir => ["/opt/logstash/patterns","/opt/logstash/extra_patterns"] |
3)remove_field:如果匹配到某个”日志字段,则将匹配的这个日志字段从这条日志中删除(多个以逗号隔开)
remove_field => ["foo _%{somefield}"] |
2、 clone-filter:克隆过滤器用于复制事件
3、 drop-filter:丢弃所有活动
4、 json-filter:解析JSON事件
5、 kv-filter:解析键值对
非常用参数:
参考教程:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
十二、Logstash-output插件及插件参数概览
所有输出插件均支持以下配置:
Setting |
Input type |
Required |
codec |
codec |
No(默认plain) |
enable_metric |
boolean |
No(默认true) |
id |
string |
No |
常用插件:
1、Elasticsearch-output:此插件是在Elasticsearch中存储日志的推荐方法。如果您打算使用Kibana Web界面,则需要使用此输出
2、file-output:此输出将事件写入磁盘上的文件(path字段必填项)
3、kafka-output:将事件写入Kafka主题(topic_id是必填项)
4、 redis-output:此输出将使用RPUSH将事件发送到Redis队列
5、stdout-output:一个简单的输出,打印到运行Logstash的shell的STDOUT
非常用插件:
参考官网教程链接:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
十三、Logstash与flume简单对比
1)结构:
Logstash: Shipper、Broker、Indexer (broker部署redis或者kafka进行缓存)
Flume: Source、Channel、Sink
Logstash已集成,broker可以不需要,直接读取处理输出,不进行缓存
Flume需单独配置,三组件缺一不可
2)配置:
Logstash:配置简洁清晰,三个部分的属性都定义好了,可自行选择,若没有,可自行开发插件,便捷易用;且logstash在Filter plugin部分具有比较完备的功能,比如grok,能通过正则解析和结构化任何文本,Grok 目前是Logstash最好的方式对非结构化日志数据解析成结构化和可查询化。此外,Logstash还可以重命名、删除、替换和修改事件字段,当然也包括完全丢弃事件,如debug事件。还有很多的复杂功能可供选择,
Flume:配置繁琐,分别手动配置source、channel、sink,采集环境如果复杂需要多个。Flume的插件比较多,channel常用的就内存和文件两种
3)初衷:
Flume侧重数据的传输,使用者需非常清楚整个数据的路由,相对来说其更可靠,channel是用于持久化目的的,数据必须确认传输到下一个目的地,才会删除;
Logstash侧重数据的预处理,日志字段经过预处理之后再进行解析
4)组件:
logstash可以与elk其他组件配合使用、开发,应用简单,使用场景广泛;
flume新版本轻量级,适合有一定计算编程基础的人使用,且场景针对性强,需要配合很多其他工具进行使用,不方便
5)举例:
Logstash:主板、电源、硬盘,机箱等都已经装好的台式机,可以直接用
Flume :提供一套完整的主板,电源、硬盘、机箱等,自行组装,装好了才能用