一、前言

ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决方案。本文将会介绍ELK常见的架构以及相关问题解决。

Filebeat:Filebeat是一款轻量级,占用服务资源非常少的数据收集引擎,它是ELK家族的新成员,可以代替Logstash作为在应用服务器端的日志收集引擎,支持将收集到的数据输出到Kafka,Redis等队列。
Logstash:数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。
Elasticsearch:分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储,分析,以及强大的数据搜索和聚合功能。
Kibana:数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能。
欢迎工作一到五年的Java工程师朋友们加入Java架构开发:798891710

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
同时大家可以多多关注一下小编公众号:Java架构师秘籍 纯干货 大家一起学习进步

二、ELK常见部署架构

2.1、Logstash作为日志收集器
这种架构是比较原始的部署架构,在各应用服务器端分别部署一个Logstash组件,作为日志收集器,然后将Logstash收集到的数据过滤、分析、格式化处理后发送至Elasticsearch存储,最后使用Kibana进行可视化展示,这种架构不足的是:Logstash比较耗服务器资源,所以会增加应用服务器端的负载压力。

2.2、Filebeat作为日志收集器
该架构与第一种架构唯一不同的是:应用端日志收集器换成了Filebeat,Filebeat轻量,占用服务器资源少,所以使用Filebeat作为应用服务器端的日志收集器,一般Filebeat会配合Logstash一起使用,这种部署方式也是目前最常用的架构。

2.3、引入缓存队列的部署架构
该架构在第二种架构的基础上引入了Kafka消息队列(还可以是其他消息队列),将Filebeat收集到的数据发送至Kafka,然后在通过Logstasth读取Kafka中的数据,这种架构主要是解决大数据量下的日志收集方案,使用缓存队列主要是解决数据安全与均衡Logstash与Elasticsearch负载压力。

2.4、以上三种架构的总结
第一种部署架构由于资源占用问题,现已很少使用,目前使用最多的是第二种部署架构,至于第三种部署架构个人觉得没有必要引入消息队列,除非有其他需求,因为在数据量较大的情况下,Filebeat 使用压力敏感协议向 Logstash 或 Elasticsearch 发送数据。如果 Logstash 正在繁忙地处理数据,它会告知 Filebeat 减慢读取速度。拥塞解决后,Filebeat 将恢复初始速度并继续发送数据。

三、问题及解决方案

问题:如何实现日志的多行合并功能?

系统应用中的日志一般都是以特定格式进行打印的,属于同一条日志的数据可能分多行进行打印,那么在使用ELK收集日志的时候就需要将属于同一条日志的多行数据进行合并。

解决方案:使用Filebeat或Logstash中的multiline多行合并插件来实现

在使用multiline多行合并插件的时候需要注意,不同的ELK部署架构可能multiline的使用方式也不同,如果是本文的第一种部署架构,那么multiline需要在Logstash中配置使用,如果是第二种部署架构,那么multiline需要在Filebeat中配置使用,无需再在Logstash中配置multiline。

1、multiline在Filebeat中的配置方式:
filebeat.prospectors:

   paths:- /home/project/elk/logs/test.loginput_type: log multiline:pattern: '^\['negate: truematch: after

output:
logstash:
hosts: ["localhost:5044"]
pattern:正则表达式
negate:默认为false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行
match:after表示合并到上一行的末尾,before表示合并到上一行的行首
如:
pattern: '['
negate: true
match: after
该配置表示将不匹配pattern模式的行合并到上一行的末尾

2、multiline在Logstash中的配置方式
input {
beats {
port => 5044
}
}

filter {
multiline {
pattern => "%{LOGLEVEL}\s*]"
negate => true
what => "previous"
}
}

output {
elasticsearch {
hosts => "localhost:9200"
}
}
(1)Logstash中配置的what属性值为previous,相当于Filebeat中的after,Logstash中配置的what属性值为next,相当于Filebeat中的before。
(2)pattern => “%{LOGLEVEL}\s*]” 中的LOGLEVEL是Logstash预制的正则匹配模式,预制的还有好多常用的正则匹配模式,详细请看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

问题:如何将Kibana中显示日志的时间字段替换为日志信息中的时间?

默认情况下,我们在Kibana中查看的时间字段与日志信息中的时间不一致,因为默认的时间字段值是日志收集时的当前时间,所以需要将该字段的时间替换为日志信息中的时间。

解决方案:使用grok分词插件与date时间格式化插件来实现

在Logstash的配置文件的过滤器中配置grok分词插件与date时间格式化插件,如:
input {
beats {
port => 5044
}
}

filter {
multiline {
pattern => "%{LOGLEVEL}\s*][%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}]"
negate => true
what => "previous"
}

grok {
match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})" ]
}

date {
match => ["customer_time", "yyyyMMdd HH:mm:ss,SSS"] //格式化时间
target => "@timestamp" //替换默认的时间字段
}
}

output {
elasticsearch {
hosts => "localhost:9200"
}
}
如要匹配的日志格式为:“[DEBUG][20170811 10:07:31,359][DefaultBeanDefinitionDocumentReader:106] Loading bean definitions”,解析出该日志的时间字段的方式有:

① 通过引入写好的表达式文件,如表达式文件为customer_patterns,内容为:
CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}
注:内容格式为:[自定义表达式名称] [正则表达式]
然后logstash中就可以这样引用:
filter {
grok {
patterns_dir => ["./customer-patterms/mypatterns"] //引用表达式文件路径
match => [ "message" , "%{CUSTOMER_TIME:customer_time}" ] //使用自定义的grok表达式
}
}
② 以配置项的方式,规则为:(?<自定义表达式名称>正则匹配规则),如:
filter {
grok {
match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})" ]
}
}
问题:如何在Kibana中通过选择不同的系统日志模块来查看数据

一般在Kibana中显示的日志数据混合了来自不同系统模块的数据,那么如何来选择或者过滤只查看指定的系统模块的日志数据?

解决方案:新增标识不同系统模块的字段或根据不同系统模块建ES索引

1、新增标识不同系统模块的字段,然后在Kibana中可以根据该字段来过滤查询不同模块的数据
这里以第二种部署架构讲解,在Filebeat中的配置内容为:
filebeat.prospectors:

   paths:- /home/project/elk/logs/account.loginput_type: log multiline:pattern: '^\['negate: truematch: afterfields: //新增log_from字段log_from: account-paths:- /home/project/elk/logs/customer.loginput_type: log multiline:pattern: '^\['negate: truematch: afterfields:log_from: customer

output:
logstash:
hosts: ["localhost:5044"]
通过新增:log_from字段来标识不同的系统模块日志

2、根据不同的系统模块配置对应的ES索引,然后在Kibana中创建对应的索引模式匹配,即可在页面通过索引模式下拉框选择不同的系统模块数据。
这里以第二种部署架构讲解,分为两步:
① 在Filebeat中的配置内容为:
filebeat.prospectors:

   paths:- /home/project/elk/logs/account.loginput_type: log multiline:pattern: '^\['negate: truematch: afterdocument_type: account-paths:- /home/project/elk/logs/customer.loginput_type: log multiline:pattern: '^\['negate: truematch: afterdocument_type: customer

output:
logstash:
hosts: ["localhost:5044"]
通过document_type来标识不同系统模块

② 修改Logstash中output的配置内容为:

output {
elasticsearch {
hosts => "localhost:9200"
index => "%{type}"
}
}
在output中增加index属性,%{type}表示按不同的document_type值建ES索引

四、总结

本文主要介绍了ELK实时日志分析的三种部署架构,以及不同架构所能解决的问题,这三种架构中第二种部署方式是时下最流行也是最常用的部署方式,最后介绍了ELK作在日志分析中的一些问题与解决方案,说在最后,ELK不仅仅可以用来作为分布式日志数据集中式查询和管理,还可以用来作为项目应用以及服务器资源监控等场景,更多内容请看官网。

转载于:https://blog.51cto.com/13932491/2165095

分布式实时日志分析解决方案 ELK 部署架构相关推荐

  1. 分布式实时日志分析解决方案ELK部署架构

    分布式实时日志分析解决方案ELK部署架构 参考文章: (1)分布式实时日志分析解决方案ELK部署架构 (2)https://www.cnblogs.com/zhangjianbin/p/7965867 ...

  2. ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总

    前记: 去年测试了ELK,今年测试了Storm,最终因为Storm需要过多开发介入而放弃,选择了ELK.感谢互联网上各路大神,目前总算是正常运行了. logstash+elasticsearch+ki ...

  3. ELK实时日志分析平台环境部署--完整记录

    在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ ==== ...

  4. 开源实时日志分析平台—ELK

    ELK简介 什么是日志 日志就是程序产生的,遵循一定格式(通常包含时间戳)的文本数据. 通常日志由服务器生成,输出到不同的文件中,一般会有系统日志. 应用日志.安全日志.这些日志分散地存储在不同的机器 ...

  5. 日志分析平台ELK部署初学

    1)ELK介绍 ELK官方网站:https://www.elastic.co/products elk-docker 官网:http://elk-docker.readthedocs.org/#ins ...

  6. 实时日志分析系统-ELK

    一.ELK简介 1.什么是日志 日志就是程序产生的,遵循一定格式(通常包括时间戳)的文本数据. 通常日志由服务器生成,输出到不同的文件中,一般会有系统日志. 应用日志.安全日志.这些日志分散地存储在不 ...

  7. ELK(ElasticSearch, Logstash, Kibana)实时日志分析平台部署

    开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch.Logstash和Kiabana三个开源工具组成.官方网站:https://www.elastic.co/p ...

  8. 开源实时日志分析ELK平台部署

    开源实时日志分析ELK平台部署 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷 ...

  9. 大数据主题分享第三期 | 基于ELK的亿级实时日志分析平台实践

    猫友会希望建立更多高质量垂直细分社群,本次是"大数据学习交流付费群"的第三期分享. "大数据学习交流付费群"由猫友会联合,斗鱼数据平台总监吴瑞诚,卷皮BI技术总 ...

最新文章

  1. python爬取抖音评论_怎样用Python3爬取抖音神曲
  2. c# 加密解密帮助类
  3. 工厂方法模式适用场景
  4. 在html中怎么写加起来的,css可以在html里面写吗?
  5. python模拟登录webspare_全面解读python web 程序的9种部署方式
  6. MTK 驱动(64)---Mtk touch panel驱动/TP驱动详解
  7. 设定所有tableView中cell的分隔线颜色
  8. GCC的缺陷,由匿名对象引起的内存泄漏
  9. html5 video视频资源保护,HTML5 视频播放 video
  10. 数学建模之排队论模型及代码
  11. 中国移动Cmpp java实现_CMPP-java 中国移动CMPP协议java开发包 - 下载 - 搜珍网
  12. 海康萤石云硬盘录像机SDK使用
  13. 计算机网络技术ui设计,UI设计小白到大神的进阶之路—入门基础篇
  14. 淘宝联盟官方APi在小程序云函数中的使用教程(附案例)
  15. 新概念三-Lesson1-课文笔记
  16. CSDN 的 使用指南
  17. mysql group by 和 having 使用注意事项
  18. FBI 网站都被黑了?
  19. 20181207股票复盘
  20. ROCKEY4 Emulator 最後修改版

热门文章

  1. Python中const类的实现
  2. oracle 分组 top10 sql,oracle sql 合龙 分组 聚合函数
  3. linux限制组访问权限,linux用户和组管理以及文件权限访问控制ACL策略
  4. 计算机无法启动显示空格闪烁,我的电脑打不开怎么把硬盘格式化
  5. C++安全方向openssl(三):3.2 md5算法原理详解以及代码实现
  6. C++安全方向:(三)课前导学:密码学核心开发技术
  7. linux 可道云_如何搭建私有云
  8. SpringBoot POM 热部署(spring-boot-devtools)
  9. Boosting GDBT
  10. javascript class static