ELK日志分析系统随着软件行业elkjava代码的发展elkjava代码,软件系统的生产部署结构日趋复杂 。对于一个分布式的系统,同一应用通常部署在不同的节点上 , 通过负载均衡的方式将请求分发到各个不同的节点进行处理 。此时就会相对增加生产运维的复杂度,在进行问题查询的时候很难判断本次请求是在哪台机器上执行的,也就无法快速的对日志进行查询从而定位问题,因此,就需要对日志进行统一的处理和分析,以便方便开发和运维人员的问题处理速度 。
本文介绍的是elastic stack开源的ELK组件,主要包括elasticsearch(简称es),logstash , kibana三个核心组件 。
es是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能,对外提供REST和java api,可扩展性的分布式系统 。
Logstash是一个用来搜集、分析、过滤日志的工具,几乎支持所有类型的日志,能够接收多种来源的日志,包括syslog、mq,并且能够输出到多种介质中 , 包括es,邮件等等 。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据 。它利用Elasticsearch的REST接口来检索数据,不仅允许用户定制仪表板视图,还允许用户使用es语法进行操作 。
但是 , 在实际使用的过程中发现,logstash会占用很多系统资源,因此决定加入一个更轻量的日志收集组件(也是elastic stack的组件之一)filebeat 。因此在加入filebeat之后,整个部署架构变成elkjava代码了如下图所示 。
安装包:
elasticsearch-6.6.2.tar.gz
kibana-6.6.2-linux-x86_64.tar.gz
logstash-6.6.2.tar.gz
filebeat-6.6.0-linux-x86_64.tar.gz
jdk-8u192-linux-x64.tar.gz
机器:
192.168.45.174,192.168.45.175,192.168.45.176(ES集群)
192.168.45.2(logstash , kibana)
192.168.45.136(应用服务器,安装filebeat)
注(1):由于ELK组件都是使用java开发的 , 因此需要安装1.8以上版本的jdk
jdk的安装方法:
注(2):Elasticsearch不能使用root用户运行,需要单独创建用户
1)为es创建一个目录
2)创建一个elk用户 , 并为elk用户授权elasticsearch目录
3)上传es的安装包,并解压到elasticsearch目录
4)切换到root用户,修改以下文件
5)执行sysctl –p,使配置生效
6)切换回elk用户 , 进入 elasticsearch/config/目录下 , 修改es的配置文件elasticsearch.yml
1)将filebeat上传到要进行日志收集的服务器上192.168.45.136,并解压
2)修改配置文件
a.修改其中的enabled为true,并配置paths(要收集的日志路径,可以使用* 代替) 。也可以根据exclude_lines和include_lines来做一些过滤日志的行为 。
b.filebeat的配置文件路径,以及是否允许重新加载配置文件 。并设置索引的分片数量
c.配置kibana地址
d.配置logstash地址
1)将logstash安装包上传到192.168.45.2服务器并解压
tar -xvflogstash-6.6.2.tar.gz
2)修改logstash输入输出的配置文件logstash-sample.yml
a.input中配置filebeat的监听端口
b.filter中可以增加过滤条件对所有或者指定索引进行过滤
c.output中可以配置filebeat输出之后的索引
1)将kibana安装包kibana-6.6.2-linux-x86_64.tar.gz上传到192.168.45.2,并解压
tar -xvf kibana-6.6.2-linux-x86_64.tar.gz
2)修改配置文件
1)分别在对应的bin目录下执行下列操作
2)启动后可以在浏览器中输入192.168.45.2:5601来进入kibana界面进行日志查询
java存储富文本到什么数据库在接收富文本时,数据库接收含有图片内容,图片会自动转换为Base64编码保存到数据库,导数据库性能降低 。
解决:在接收富文本内容时,将接收到的图片转换为文件上传到Minio(Minio具体使用可参考文档),然后将base64编码替换为图片地址保存
用到的工具类
使用正则表达式提取接收内容的Base64编码工具类
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ImgBaseUtil {
public static ListString getImgStr(String htmlStr) {
ListString list = new ArrayList();
String img = "";
Pattern p_image;
Matcher m_image;
// String regEx_img = "img.*src=https://www.04ip.com/post/(.*?)[^]*?"; //图片链接地址
String regEx_img = "img.*src\\s*=\\s*(.*?)[^]*?";
p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
// 得到img /数据
img = m_image.group();
// 匹配img中的src数据
Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"||\\s )").matcher(img);
while (m.find()) {
list.add(m.group(1));
}
}
return list;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
将Base64编码转换为文件流的工具类
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;
import java.io.*;
public class BASE64DecodedMultipartFile implements MultipartFile {
private final byte[] imgContent;
private final String header;
public BASE64DecodedMultipartFile(byte[] imgContent, String header) {
this.imgContent = imgContent;
this.header = header.split(";")[0];
}
@Override
public String getName() {
return System.currentTimeMillis()Math.random()"."header.split("/")[1];
}
@Override
public String getOriginalFilename() {
return System.currentTimeMillis()(int) Math.random() * 10000"."header.split("/")[1];
}
@Override
public String getContentType() {
return header.split(":")[1];
}
@Override
public boolean isEmpty() {
return imgContent == null || imgContent.length == 0;
}
@Override
public long getSize() {
return imgContent.length;
}
@Override
public byte[] getBytes() throws IOException {
return imgContent;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(imgContent);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
new FileOutputStream(dest).write(imgContent);
}
public static MultipartFile base64ToMultipart(String base64) {
try {
String[] baseStrs = base64.split(",");
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = new byte[0];
b = decoder.decodeBuffer(baseStrs[1]);
for (int i = 0; ib.length;i) {
if (b[i]0) {
【elkjava代码 elk java】b[i]= 256;
}
}
return new BASE64DecodedMultipartFile(b, baseStrs[0]);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
内容接收并完成处理工具类
public class RichTextUtil {
/**
*
* @param text 富文本内容
* @return返回处理图片后的数据
*/
publicString richText(String text,MinioUtils minioUtils,MinioConfig minioConfig){
String s=new String(text);
String result=null;//返回结果
ListString imgStr = ImgBaseUtil.getImgStr(s); //每组base64编码图片
if (imgStr.isEmpty()){
return text;
}
for (String s1:imgStr){ //每个base64转换并上传
String s2= UUID.randomUUID().toString().replaceAll("-","") ".jpg"; //新的文件链接
//上传
MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(s1);
assert multipartFile != null;
minioUtils.putObject1(multipartFile,minioConfig.getBucketName(),s2);
String foreverUrl=minioConfig.getEndpoint() ":" minioConfig.getPort() "/" minioConfig.getBucketName() "/" s2;//永久链接
if (Objects.isNull(result)){
result=s.replace(s1,foreverUrl); //第一次替换
}
result=result.replace(s1,foreverUrl); //前边替换过,继续替换
}
return result;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
配合Minio工具类使用
@GetMapping("/tss")
public String dmo(@RequestBody Entity entity) throws IOException {
String s=entity.getContent();//接收到的内容
RichTextUtil richTextUtil = new RichTextUtil();
String s1 = richTextUtil.richText(s,minioUtils,minioConfig);
entity.setContent(s1);//最后将转换过的内容替换就行
//数据库保存一下实体类内容
return entity;
}
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
Minio使用可查询相关资料或了解本博客SpringBoot对Minio的简单使用链接:
文章知识点与官方知识档案匹配
Java技能树使用JDBC操作数据库数据库操作
95211 人正在系统学习中
打开CSDN APP,看更多技术内容
...如D:\tmp)并回显_静静看大海的博客_java 富文本保存...
1、项目需求: 使用百度富文本编辑器实现“重要节假日高速出行指南内容”编辑,功能涉及图片、视频上传 。2、存在问题 百度富文本编辑器默认将图片、视频上传至项目里,如果使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项...
继续访问
java 保存富文本_如何从Web应用程序保存富文本并将其显示在富文本框中...
我建议弹出打开的写字板(开始 - 运行... -wordpad),并乱用不同的字体样式等 . 然后将其保存为某处的RTF文档 . 在您选择的纯文本编辑器中打开该文档(我使用Notepad),这将帮助您更轻松地找出RTF . ...
继续访问
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
Bootstrap提供了一个叫wysiwyg的富文本组件,用来显示和编辑富文本数据 , 但如何将编辑后的数据保存到MySQL数据库,却不得而知 。另外,如何将mysql数据库中的数据显示到wysiwyg也不得而知,对于这两个问题,让我来告诉你解决方案! 一、效果展示 首先,我们先来看看效果如何: 富文本中有一张图片,还有一个数字列表 我们可以看到编辑后的数据保存成功,以及保存后对应的展示 。二、富文本 度娘对于富文本的解释如下: 富文本格式(Rich Text Format, 一般简称为RTF)是由微软公司开发的跨平台文档格式 。大多数的文字处理软件都能读取和保存RTF文档 。RTF是Rich
富文本保存到数据库
标题 富文本保存到数据库 -idea String html = "p wx:nodeid='135'1.地方/pp wx:nodeid='156'2.第三方"; // 前端传过来的富文本内容 String temp = HtmlUtils.htmlEscapeHex(html); System.err.println("存数据库=\r\n"temp); resume.setExperience(temp); Strin
继续访问
java中使用poi如何导富文本,Apache的POI - 读取和存储DB富文本内容
Using your favorite Java-to-database framework (JDBC, Hibernate, etc.), store the String value into contents in rich_text_string, and the associated FormattingRun object data into rt_formatting_runs. ...
继续访问
富文本保存到数据库_黑潮之羽的博客_富文本保存到数据库
富文本保存到数据库 String html = "1.地方2.第三方"; // 前端传过来的富文本内容 String temp = HtmlUtils.htmlEscapeHex(html); System.err.println("存数据库=\r\n"temp); resume.setExperience(temp); String returnHt...
继续访问
java富文本
【代码】java富文本 。
继续访问
富文本编辑器存MYSQL数据库
一、MYSQL数据库对应数据类型选用 longtest类型,对应java和mybatis框架类型为string 。二、富文本编辑器有特殊字符 , 存数据库会转义 在java代码中,添加org.springframework.web.util.HtmlUtils 包下的 HtmlUtils.htmlEscapeHex(String);把html的特殊字符转换成符合Intel HEX文件的字符串 HtmlUtils.htmlUnescape(...
继续访问
Java开发之富文本编辑器TinyMCE
一、题外话 最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块 。系统采用的是FCKEditor,自我感觉不是很好,如下图 特别是在用户想插入一个图片的话,就很麻烦,所有用户共享一个文件目录 , 这样就不好了,于是便想到了TinyMCE编辑器,博客园默认的也是这个编辑器 , 接下 来,我们开始吧 二、TinyMCE编辑器集成步骤 2.1:下载相关文件...
继续访问
Java实现多文件上传下载,kindeditor富文本保存为word文件,文件列表分页显示
介绍 SpringBoot Thymeleaf Mybaits项目部分功能,实现文件的多文件上传和下载,以及将kindeditor富文本内容保存为.doc文件 文件上传/创建后以列表形式显示,并且可以分页显示 提示 简单记录 , 仅供参考,代码并不完整,需要简单修改后才能使用(没提供.css文件,需要删除html中的class;另外部分变量通过session获取,可以适当修改) 关键代码 html: !DOCTYPE html html lang="en" xmlns:th="http
继续访问
JAVA:富文本框截图 , 将图片的Base64转File文件进行保存
代码】JAVA:富文本框截图,将图片的Base64转File文件进行保存 。
继续访问
java 富文本框内容 保存与恢复,将富文本框内容直接保存到文件中 。(不使用savefile对话框)...
how can I save the contents of a rich text box without needing to open the save file dialog.i think its something like:richTextBox1.SaveFile(@"\Documents\save_file_here.rtf");but it cant find the file...
继续访问
java富文本编辑数据存储到数据库简单实现
java富文本编辑数据存储到数据库简单实现-小白日记 前端代码 link rel="stylesheet" href="https://www.04ip.com/themes/default/default.css" / script charset="utf-8" src="https://www.04ip.com/kindeditor-all.js"/script script charset="utf-8" src="https://www.04ip.com/lang/zh-CN.js"/script ...
继续访问
Java解析富文本
富文本Java解析
继续访问
java 关于处理富文本保存,查询,更新过慢问题
java 关于处理富文本保存,查询,更新过慢问题 首先了解为什么富文本保存,查询,更新会过慢 数据库富文本字段类型为:longtext 类型 假如富文本里面只保存文字的话,保存,查询,更新都会很快 注意:只有富文本里面插入图片或者视频的时候才会变的很慢–因为前端富文本组件会把图片或视频直接转化为base64编码,这样保存量数据就会变的极大! 解决方案: 后端提供一个文件上传的接口,前端富文本要插入图片的时候直接调上传接口,先把图片或者视频上传到服务器,返回图片的url,前端把url直接放到 im
继续访问
记一次富文本编辑器保存内容到数据库转换内容的问题
项目上要用到富文本编辑器,保存到数据库的时候它会自动转换成非HTML的格式,再次从数据库读取到页面后格式全乱了 。如图:如果我们要按一开始我们输入的格式正常显示需要对保存的内容进行转换,转换成正常的HTML的格式方法是需要用到commons-lang3-3.3.2.jar 这个jar包下面的一个工具类String qualiHtml=StringEscapeUtils.unescapeHtml4(r...
继续访问
java 富文本 word_Java导出富文本到word
源码地址:背景最近用java开发一个中车项目管理系统,里面有一个维修单word导出功能 。可用方案在网上查找资料,总结出两种比较可行的方案 。(1) 制作word模板,导出成mht文件(单页面网页格式),然后往模板里渲染数据 , 最终生成word文档 。(2) 制作word模板,导出成xml文件,然后往模板里渲染数据,最终生成word文档 。两种都是采用模板的思想,比用poi去组织word格式简单的很多很多 。...
继续访问
191210P4 Java富文本编辑之图片链接本地化
Java富文本编辑之图片链接本地化 作者:邵发 官网: 本文介绍在图文混编项目中(博客、新闻等),如何将富文本中的图片外链转为本地链接的问题 。本文是Java学习指南系列教程的官方配套文档,项目源码在本文末尾说明 。所谓富文本Rich Text,就是以HTML形式表示的文本 。在前端通常由富文本编辑器得到,比如UEditor,KindEditor,w...
继续访问
java 富文本框内容 保存与恢复_使用富文本编辑器保存数据后进行fastjson格式转换异常及序列化处理...
最近线上的ELK日志监控爆出几个异常问题 , jsonException的解析问题 。如下:message: 2019-04-10 23:37:43,952 ERROR aop.AspectAdvice eid=410724004 not match : - ,com.alibaba.fastjson.JSONException: not match : - , atcom.alibaba.fastjs...
继续访问
富文本编辑器内容存储至Mysql
文章目录概述获取富文本编辑器内容后端数据处理 概述 在所有的编辑器中 , 大概最受欢迎的就是富文本编辑器和MarkDown编辑器了,无论哪一种编辑器,我们需要知道的是,发给后端的内容是带着html标签的字符串 , 而我们需要把这些字符串存储到数据库中,其实原理非常简单,为了便于理解,我们首先创建一张表: CREATE TABLE `tb_title` ( `title_id` int(11) NOT NULL COMMENT '文章Id', `sort_id` int(11) DEFAULT NULL CO
继续访问
富文本数据保存
原文: Bootstrap提供了一个叫wysiwyg的富文本组件,用来显示和编辑富文本数据,但如何将编辑后的数据保存到mysql数据库,却不得而知 。另外,如何将mysql数据库中的数据显示到wysiwyg也不得而知 , 对于这两个问题,让我来告诉你解决方案! 一、效果展示 首先,我们先来看...
继续访问
最新发布 java 将富文本转化为word,保留原本格式
通过java,将富文本转化为word
继续访问
热门推荐 Bootstrap wysiwyg , 将富文本数据保存到mysql
Bootstrap提供了一个叫[wysiwyg]()的富文本组件 , 用来显示和编辑富文本数据,但如何将编辑后的数据保存到mysql数据库,却不得而知
继续访问
java富文本框信息如何保存
java
开发语言
写评论
评论
10
3
踩
分享
分布式日志系统Graylog、Loki及ELK的分析和对比日志系列:
企业级日志平台新秀Graylog,比ELK轻量多了
日志系统新贵Loki,比ELK轻量多了
1. 为什么需要集中的日志系统?
在分布式系统中,众多服务分散部署在数十台甚至是上百台不同的服务器上,要想快速方便的实现查找、分析和归档等功能,使用Linux命令等传统的方式查询到想要的日志就费时费力,更不要说对日志进行分析与归纳 。
如果有一个集中的日志系统,便可以将各个不同的服务器上面的日志收集在一起 , 不仅能方便快速查找到相应的日志 , 还有可能在众多日志数据中挖掘到一些意想不到的关联关系 。
作为DevOps工程师,会经常收到分析生产日志的需求 。在机器规模较少、生产环境管理不规范时,可以通过分配系统账号,采用人肉的方式登录服务器查看日志 。然而高可用架构中,日志通常分散在多节点 , 日志量也随着业务增长而增加 。当业务达到一定规模、架构变得复杂,靠人肉登录主机查看日志的方式就会变得混乱和低效 。解决这种问题的方法,需要构建一个日志管理平台:对日志进行汇聚和分析,并通过Web UI授权相关人员查看日志权限 。
2. 日志系统选择与对比
关于企业级日志管理方案,比较主流的是ELK stack和Graylog 。
常见的分布式日志系统解决方案有经典的ELK和商业的splunk 。为什么没有选择上面的两种方案呢,原因主要是如下两种:
ELK目前很多公司都在使用,是一种很不错的分布式日志解决方案 , 但是需要的组件多,部署和维护相对复杂,并且占用服务器资源多,此外kibana也在高版本中开始商业化 。
splunk是收费的商业项目,不在考虑范围 。
3. 认识graylog
3.1 简介
graylog是一个简单易用、功能较全面的日志管理工具,graylog也采用Elasticsearch作为存储和索引以保障性能,MongoDB用来存储少量的自身配置信息 , master-node模式具有很好的扩展性,UI上自带的基础查询与分析功能比较实用且高效,支持LDAP、权限控制并有丰富的日志类型和标准(如syslog , GELF)并支持基于日志的报警 。
在日志接收方面通常是网络传输,可以是TCP也可以是UDP,在实际生产环境量级较大多数采用UDP,也可以通过MQ来消费日志 。
3.2 优势
部署维护简单
资源占用较少
查询语法简单易懂(对比ES的语法…)
内置简单的告警
可以将搜索结果导出为 json
UI 比较友好
3.3 graylog单机架构图
3.4 graylog集群架构
4、基于 GrayLogELK 的日志监控
Collector
FileBeat:轻巧占用资源少,但是功能有点弱 。「想起了一些东西,都是泪」
Fluentd:个人理解在Logstash与FileBeat中间,可以简单处理一些日志 , 插件丰富「要再研究下」
自己弄:架构图里面只是mysql调用了自己实现的解析工具 , 但是其实当日志大到一定的量的还是必须自己来的,类似日志抽样、降级、控制频率等功能 , 是要真真切切的花费大量时间精力下去的一个sidecar并非动动嘴巴就能搞定的 。「都是泪」
Queue
Kafka:王者地位「量小的时候也可以不用这个直接朝后面输出,有很多中间方案大家自己脑补」,不同的日志分不同的topic,严格区分日志所属类型,为后续消费打下基?。?比如A业务进入A Topic并在日志中打上所属语言类型的Tag 。
Consumer
Logstash:其实这个东西也可以作为收集端来使用,就是比较耗费资源有点重,还会莫名其妙挂了「应该是我不会玩」
GrayLog:本人最喜欢的一个组件,集解析、报警、简单分析、Dashboard、日志TTL的综合体,有这个东西吧其实Kibana就没啥用了 , 毕竟谁没事天天去分析日志 。
Storage
ElasticSearch:全文索引Engine , 其实并没有官方说的那么牛,当到一定的并发写入、大量查询之后其实根本不是加机器能解决的,怎么分shard,是按照天保存还是按照条数保存「我比较喜欢按照条数保存,这样可以保证每个index都差不多大小 , 对于reblance是有好处的,重复利用多盘」如何保存是需要不断调整的 。「我们这边不讨论MongoDB去存日志,看着都不靠谱」
规范
其实日志系统最关键的是怎么打、什么格式打、但是这个东西需要消耗大量的时间去定义与各个部门Pk,遇到过大量不讲理的输出 , 直接线上Debug,600k的并发写入,日志又大又臭谁能扛得住「阿里云的SLS是真的很牛」
卷起袖子加油干,少动嘴,多动手 , 日志很好玩 。在容器化的大环境下也越发的重要 。
FluntedElasticsearchKibana的方案,发现有几个缺点:
不能处理多行日志,比如Mysql慢查询,Tomcat/Jetty应用的Java异常打印
不能保留原始日志,只能把原始日志分字段保存,这样搜索日志结果是一堆Json格式文本,无法阅读 。
不符合正则表达式匹配的日志行,被全部丢弃 。
对比图
总结
虽然两种解决方案在功能上非常相似,但仍有一些差异需要考虑 。
两者之间最重要的区别在于,从一开始,Graylog就定位为强大的日志解决方案,而ELK则是大数据解决方案 。Graylog可以通过网络协议直接从应用程序接收结构化日志和标准syslog 。相反,ELK是使用Logstash分析已收集的纯文本日志的解决方案,然后解析并将它们传递给ElasticSearch 。
在ELK中,Kibana扮演仪表盘的角色并显示从Logstash收到的数据 。Graylog在这点上更方便 , 因为它提供了单一应用程序解决方案(不包括ElasticSearch作为灵活的数据存储),具有几乎相同的功能 。因此 , 部署所需的时间更短 。此外 , 与ELK相比,Graylog开箱即用,且具有出色的权限系统,而Kibana则不具备此功能 。作为Elasticsearch的粉丝,我更喜欢Graylog而不是ELK , 因为它完全符合我在日志管理方面的需求 。
Graylog具有直观的GUI,并提供警报、报告和自定义分析功能 。最重要的是,它能在多个日志源和跨机房收集数TB的数据 。基于这些优势,我更喜欢用Graylog而不是另一个具有类似功能的流行堆栈——ELK 。
如果有需要领取免费资料的小伙伴们 , 可以点击此处领取资料哦!
「SpringCloud」(三十八)搭建ELK日志采集与分析系统?一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈、查找定位系统问题 。上一篇说明了日志的多种业务场景以及日志记录的实现方式 , 那么日志记录下来 , 相关人员就需要对日志数据进行处理与分析,基于E(ElasticSearch)L(Logstash)K(Kibana)组合的日志分析系统可以说是目前各家公司普遍的首选方案 。
??作为微服务集群,必须要考虑当微服务访问量暴增时的高并发场景,此时系统的日志数据同样是爆发式增长,我们需要通过消息队列做流量削峰处理,Logstash官方提供Redis、Kafka、RabbitMQ等输入插件 。Redis虽然可以用作消息队列 , 但其各项功能显示不如单一实现的消息队列,所以通常情况下并不使用它的消息队列功能;Kafka的性能要优于RabbitMQ,通常在日志采集,数据采集时使用较多,所以这里我们采用Kafka实现消息队列功能 。
??ELK日志分析系统中,数据传输、数据保存、数据展示、流量削峰功能都有了,还少一个组件,就是日志数据的采集,虽然log4j2可以将日志数据发送到Kafka,甚至可以将日志直接输入到Logstash , 但是基于系统设计解耦的考虑,业务系统运行不会影响到日志分析系统,同时日志分析系统也不会影响到业务系统,所以,业务只需将日志记录下来,然后由日志分析系统去采集分析即可,Filebeat是ELK日志系统中常用的日志采集器,它是 Elastic Stack 的一部分,因此能够与 Logstash、Elasticsearch 和 Kibana 无缝协作 。
软件下载:
??因经常遇到在内网搭建环境的问题,所以这里习惯使用下载软件包的方式进行安装,虽没有使用Yum、Docker等安装方便,但是可以对软件目录、配置信息等有更深的了解,在后续采用Yum、Docker等方式安装时,也能清楚安装了哪些东西,安装配置的文件是怎样的,即使出现问题,也可以快速的定位解决 。
Elastic Stack全家桶下载主页:
我们选择如下版本:
Kafka下载:
??安装前先准备好三台CentOS7服务器用于集群安装,这是IP地址为:172.16.20.220、172.16.20.221、172.16.20.222,然后将上面下载的软件包上传至三台服务器的/usr/local目录 。因服务器资源有限,这里所有的软件都安装在这三台集群服务器上 , 在实际生产环境中,请根据业务需求设计规划进行安装 。
??在集群搭建时,如果能够编写shell安装脚本就会很方便,如果不能编写,就需要在每台服务器上执行安装命令,多数ssh客户端提供了多会话同时输入的功能 , 这里一些通用安装命令可以选择启用该功能 。
新建/usr/local/java目录
将下载的jdk软件包jdk-8u64-linux-x64.tar.gz上传到/usr/local/java目录,然后解压
配置环境变量/etc/profile
在底部添加以下内容
使环境变量生效
备注:后续可通过此命令停止elasticsearch运行
??新建kafka的日志目录和zookeeper数据目录 , 因为这两项默认放在tmp目录 , 而tmp目录中内容会随重启而丢失,所以我们自定义以下目录:
修改如下:
在data文件夹中新建myid文件,myid文件的内容为1(一句话创建:echo 1myid)
kafka启动时先启动zookeeper,再启动kafka;关闭时相反 , 先关闭kafka,再关闭zookeeper 。
1、zookeeper启动命令
后台运行启动命令:
或者
查看集群状态:
2、kafka启动命令
后台运行启动命令:
或者
3、创建topic,最新版本已经不需要使用zookeeper参数创建 。
参数解释:
复制两份
--replication-factor 2
创建1个分区
--partitions 1
topic 名称
--topic test
4、查看已经存在的topic(三台设备都执行时可以看到)
5、启动生产者:
6、启动消费者:
添加参数 --from-beginning 从开始位置消费,不是从最新消息
7、测试:在生产者输入test,可以在消费者的两台服务器上看到同样的字符test,说明Kafka服务器集群已搭建成功 。
Logstash没有提供集群安装方式,相互之间并没有交互 , 但是我们可以配置同属一个Kafka消费者组 , 来实现统一消息只消费一次的功能 。
??Filebeat用于安装在业务软件运行服务器,收集业务产生的日志,并推送到我们配置的Kafka、Redis、RabbitMQ等消息中间件,或者直接保存到Elasticsearch , 下面来讲解如何安装配置:
1、进入到/usr/local目录,执行解压命令
2、编辑配置filebeat.yml
??配置文件中默认是输出到elasticsearch,这里我们改为kafka,同文件目录下的filebeat.reference.yml文件是所有配置的实例,可以直接将kafka的配置复制到filebeat.yml
后台启动命令
停止命令
2、测试logstash是消费Kafka的日志主题,并将日志内容存入Elasticsearch
自动新增的两个index , 规则是logstash中配置的
数据浏览页可以看到Elasticsearch中存储的日志数据内容,说明我们的配置已经生效 。
Gitee: GitEgg: GitEgg 是一款开源免费的企业级微服务应用开发框架 , 旨在整合目前主流稳定的开源技术框架,集成常用的最佳项目解决方案 , 实现可直接使用的微服务快速开发框架 。
GitHub:
ELK(kibana Discover)查询不到问题之前我们的系统架构是这样的,直接elk保存进去es里面 , 也就是Logstash直接读取信息保存进入es里面 , 后面改为通过java直接保存进去es里面,但是在
kibana Discover这个界面查询不到
按道理来说es保存没有报错,抛出异常,是正常保存进去的,通过es的 restful api可以正常查询到 , 想到可能是Logstash保存数据时候进行了特殊处理,观察
Discover界面接口请求参数,会发现有个这样的(下图)
增加之后保存进去,发现可以正常保存
ELK——01安装ELKCentos 7.7
因为搭建ELK需要Java环境,所以需要知道JAVA_HOME 。
我最终在 /usr/lib/jvm/jre-1.8.0-openjdk 中知道了JDK,然后指定此路径为JAVA_HOME 。
logstash官网
直接安装logstash官网方式安装 。
和logstash一样,采用yum安装方式,直接看官网教程,不再赘述 。
ELK也是cs架构,所以会有一个服务器用于接收存储并展示日志 , 此账号用于客户端 。
一般而言,会为ELK专门创建一个账号 。这个账号会用于所有ELKelkjava代码的相关连接和通信 。
user_name改为用户名,your_pwd改为密码 。
这是出于系统安全考虑设置的条件 。由于ElasticSearch可以接收用户输入的脚本并且执行 , 为了系统安全考虑,
建议创建一个单独的用户用来运行ElasticSearch 。
用curl 访问,看是否能得到返回值 。若得到返回值,证明elasticsearch服务启动成功 。
测试可用性elkjava代码:打开redis客户端,随便设置一个值,并取出来 。
yum 安装软件的原文件一版放置于 /etc/ 目录下,kibana也不例外,放在/etc/kibana
修改 /etc/kibana/kibana.yml 配置文件中的server.host 和 server.port , 如下图所示 。
然后再通过浏览器访问kibana的地址就可以了 。
elkjava代码的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于elk java、elkjava代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 使用html代码建立超链接,html创建超链接
- 运营集团的公众号,公众号代代运营
- 即时战略游戏全面战争,最新全面战争游戏
- 上手flutter需要多久,flutter难吗
- c语言函数打印图像 c语言如何打印图像
- 为什么视频存不到电脑上,为什么iphone视频传不到电脑
- 生死狙击游戏解说角色扮演,生死狙击有名解说
- 金币动作游戏,金币动作游戏有哪些
- go语言trim Go语言面试题