热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ElasticStack综合案例

本篇将我们前面学习到的技术:ElasticSearch、Beats、Kibana、Logstash整合起来,做一个综合性的学习,目的是为了让小伙伴们能够更加深刻的理解Elastic

本篇将我们前面学习到的技术:ElasticSearch、Beats、Kibana、Logstash 整合起来,做一个综合性的学习,目的是为了让小伙伴们能够更加深刻的理解ElasticStack的使用


流程说明

 

 



  • 应用APP生产日志,用来记录用户的操作

    • [INFO] 2019-03-15 22:55:20 [Main] - DAU|5206|使用优惠券|2019-03-15 03:37:20

    • [INFO] 2019-03-15 22:55:21 [Main] - DAU|3880|浏览页面|2019-03-15 07:25:09



  • 通过Filebeat读取日志文件中的内容,并且将内容发送给Logstash,原因是需要对内容做处理

  • Logstash接收到内容后,进行处理,如分割操作,然后将内容发送到Elasticsearch中

  • Kibana会读取Elasticsearch中的数据,并且在Kibana中进行设计Dashboard,最后进行展示


说明:日志格式、图表、Dashboard都是自定义的

  


App介绍

APP在生产环境应该是真实系统,然而,现在我们学习的话,为了简化操作,所以就做数据的模拟生成即可。

业务代码如下:

package com.log;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.joda.time.DateTime;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
public class Main {
public static final String[] VISIT = new String[]{"浏览页面", "评论商品", "加入收藏", "加入购物车", "提交订单", "使用优惠券", "领取优惠券", "搜索", "查看订单"};
public static void main(String[] args) throws Exception {
while(true){
Long sleep
= RandomUtils.nextLong(200, 1000 * 5);
Thread.sleep(sleep);
Long maxUserId
= 9999L;
Long userId
= RandomUtils.nextLong(1, maxUserId);
String visit
= VISIT[RandomUtils.nextInt(0, VISIT.length)];
DateTime now
= new DateTime();
int maxHour = now.getHourOfDay();
int maxMillis = now.getMinuteOfHour();
int maxSecOnds= now.getSecondOfMinute();
String date
= now.plusHours(-(RandomUtils.nextInt(0, maxHour)))
.plusMinutes(
-(RandomUtils.nextInt(0, maxMillis)))
.plusSeconds(
-(RandomUtils.nextInt(0, maxSeconds)))
.toString(
"yyyy-MM-dd HH:mm:ss");
String result
= "DAU|" + userId + "|" + visit + "|" + date;
log.error(result);
}
}
}

我们可以启动运行,就是不断的生成日志,模拟了我们的实际业务

09:18:32.721 [main] ERROR com.log.Main - DAU|8183|加入购物车|2020-09-25 06:10:25
09:18:33.599 [main] ERROR com.log.Main - DAU|7097|提交订单|2020-09-25 06:18:31
09:18:37.265 [main] ERROR com.log.Main - DAU|1468|查看订单|2020-09-25 02:04:10
09:18:39.634 [main] ERROR com.log.Main - DAU|7821|领取优惠券|2020-09-25 02:04:07
09:18:41.909 [main] ERROR com.log.Main - DAU|7962|提交订单|2020-09-25 03:02:39
09:18:43.596 [main] ERROR com.log.Main - DAU|3358|评论商品|2020-09-25 08:14:19

然后我们将该项目使用下面命令进行打包

mvn clean install

打包完成后,到target目录下,能够看到我们生成的jar包

我们将其复制到我们的服务器上,然后创建一个启动的脚本 startup.sh

#!/bin/bash
nohup java
-Xms256m -Xmx512m -jar mogu-dashboard-generate-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

然后就使用脚本进行启动

# 启动
.
/startup.sh
# 启动成功后,会看到一个日志 app.log,我们可以查看
tail
-f app.log

配置Filebeat

在有了不断产生日志的应用程序后,我们就需要创建一个Filebeat的配置文件,用于日志的收集

# 打开配置文件
vim mogu
-dashboard.yml
# 写入数据
filebeat.inputs:
- type: log
enabled:
true
paths:
- /soft/app/*.log
setup.template.settings:
index.number_of_shards: 1
output.logstash:
hosts: ["127.0.0.1:5044"]

然后我们就可以启动了【需要我们把Logstash启动起来】

./filebeat -e -c mogu-dashboard.yml

配置Logstash


Logstash输出到控制台

Logstash的主要目的就是处理Filebeat发送过来的数据,进行数据的清洗,过滤等,我们首先简单的将logstash获得的数据输出到控制台

# 打开配置文件
vim mogu
-dashboard.conf
# 添加以下内容
input {
beats {
port
=> "5044"
}
}
output {
stdout { codec
=> rubydebug }
}

然后启动我们的logstash 【注意,启动时间比较长,需要我们等待】

./bin/logstash -f mogu-dashboard.conf

启动logstash完成后,我们需要再次启动filebeat,回到上面的启动步骤,然后就能看到logstash输出我们的日志


配置Logstash连接ElasticSearch

上面的数据,其实还是我们的原始数据,并没有经过处理,所以我们这个时候就需要使用到Logstash的其它功能了。我们继续修改配置文件

# 打开配置文件
vim mogu
-dashboard.conf

然后修改一下的值

input {
beats {
port
=> "5044"
}
}
filter {
mutate {
split
=> {"message"=>"|"}
}
mutate {
add_field
=> {
"userId" => "%{[message][1]}"
"visit" => "%{[message][2]}"
"date" => "%{[message][3]}"
}
}
mutate {
convert
=> {
"userId" => "integer"
"visit" => "string"
"date" => "string"
}
}
mutate {
remove_field
=> [ "host" ]
}
}
#output {
# stdout { codec
=> rubydebug }
#}
output {
elasticsearch {
hosts
=> [ "127.0.0.1:9200"]
}
}

然后再次启动

./bin/logstash -f mogu-dashboard.conf

其实能够看到,我们原来的数据,就经过了处理了,产生了新的字段

 

 同时我们还可以对我们的数据,进行类型转换,为了方便我们的下游进行处理

mutate {
convert
=> {
"userId" => "integer"
"visit" => "string"
"date" => "string"
}
}

遇到的问题1

[2020-09-25T02:32:44,042][WARN ][logstash.filters.mutate ][main][5fd6a2f2f396816d849f2e3e2e0a53f2500a9b58c6819e23f42d2bfd34cde207] Exception caught while applying mutate filter {:exception=>"Invalid FieldReference: `message[1]`"}

不断的刷这个错误,配置文件没问题,但添加字段那一个mutate需要给message套一层中括号:

mutate {
add_field
=> {
"userId" => "%{[message][1]}"
"visit" => "%{[message][2]}"
"date" => "%{[message][3]}"
}
}

遇到的问题2

filebeat 传输到host的字段中host是一个对象

failed to parse field [host] of type [text] in document

解决方法就是过滤掉host字段

mutate {
remove_field
=> [ "host" ]
}

启动ElasticSearch

在我们通过Logstash发送数据到ElasticSearch,所以我们还需要启动我们的ElasticSearch

# 切换到elsearch用户
su elsearch
# 到目录
cd
/soft/elsearch/bin
# 启动
.
/elasticsearch

启动Kibana

我们最后就需要通过Kibana来展示我们的图形化数据

# 启动kibana
.
/bin/kibana
# 通过浏览器访问
http:
//202.193.56.222:5601/app/kibana

添加到索引库

添加Logstash索引到Kibana中:

http://202.193.56.222:5601/app/management/kibana/indexPatterns/create

 

 输入我们的匹配规则,然后匹配到logstash,然后选择时间字段后创建


创建柱形图

我们点击右侧Visualizations,然后开始创建图标

 

 然后选择柱形图

 

   

 

 最后我们定义我们的X轴,选择按照时间进行添加

 

 最后更新我们的页面,然后在选择最近的30分钟

 

 


创建饼图

我们继续选择饼图

 

 然后选择我们的索引

 

 添加完成后,我们就看到这样一个页面了

 

 但是这样还不死很直观,所以我们还需要做处理,找到右侧的Buckets,然后选择Split Slices,然后把我们的每个字段都添加上去,其中visit指的是我们es中的属性

 

 最后选择update,得到的效果如下所示

 

 我们还可以继续给每个字段都添加label标签

 

 

添加完成后,更新页面,就得到非常不错的效果了~

 

   


数据表格

在图标中,选择我们需要显示的字段即可


制作Dashboard

 

 




推荐阅读
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了sqlserver云存储和本地存储的区别,云存储是将数据存储在网络上,方便查看和调用;本地存储是将数据存储在电脑磁盘上,只能在存储的电脑上查看。同时提供了几种启动sqlserver的方法。此外,还介绍了如何导出数据库的步骤和工具。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 解决php错误信息不显示在浏览器上的方法
    本文介绍了解决php错误信息不显示在浏览器上的方法。作者发现php中的各种错误信息并不显示在浏览器上,而是需要在日志文件中查看。为了解决这个问题,作者提供了一种解决方式:通过修改php.ini文件中的display_errors参数为On,并重启服务。这样就可以在浏览器上直接显示php错误信息了。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
author-avatar
看不见的风2502871717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有