ELK日志收集
目前,各个微服务系统的日志都保存在各自指定的目录中,如果这些微服务部署在不同的服务器上,那么日志文件也是分散在各自的服务器上。分散的日志不利于我们快速通过日志定位问题,我们可以借助ELK来收集各个微服务系统的日志并集中展示。
ELK即Elasticsearch、Logstash和Kibana首字母缩写。Elasticsearch用于存储日志信息,Logstash用于收集日志,Kibana用于图形化展示。
搭建ELK环境
在Windwos上搭建ELK环境较为麻烦,这里我选择在CentOS7 上通过Docker来搭建ELK环境,对Docker基本使用不熟悉的同学可以参考 Docker基础教程。
在此之前,我们需要准备一台CentOS 7虚拟机。推荐大家使用Vagrant来创建,创建教程可以参考:使用Vagrant创建CentOS虚拟机。这里分享下我的Vagrantfile配置:
Vagrant.configure("2") do |config|config.vm.box = "centos7"config.vm.network "private_network", ip: "192.168.33.10"config.vm.hostname = "febs"config.vm.provider "virtualbox" do |v|v.memory = 6144v.cpus = 2endend
上面配置了虚拟机的IP地址为192.168.33.10,hostname为febs,内存为6*1024MB(6144MB即6GB),cpu核心数为2。
安装docker
在CMD终端使用命令vagrant ssh连接虚拟机后,运行sudo -s切换到root用户,下面的示例都是用root用户完成的。
在Linux中安装Docker可以参考官方文档:CentOS | Docker Docs,主要分为下面这几步:
-
卸载旧版本Docker(如果系统之前没安装过Docker,可以跳过):
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
-
安装Docker所需要的包:
yum install -y yum-utils \device-mapper-persistent-data \lvm2
-
设置稳定的仓库:
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
-
安装最新版的Docker引擎:
yum install docker-ce docker-ce-cli containerd.io
-
启动Docker:
systemctl start docker
查看是否安装成功:

安装Docker Compose
安装好Docker后,我们接着安装Docker Compose,官方安装教程 Install | Docker Docs,主要步骤为:
-
获取Docker Compose的最新稳定版本:
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
对二进制文件授予可执行权限:
chmod +x /usr/local/bin/docker-compose
-
创建link:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
查看是否安装成功:

Docker Compose搭建ELK
在搭建ELK之前,我们需要做一些准备工作。
正如官方所说的那样 Virtual memory | Elasticsearch Guide [8.15] | Elastic,Elasticsearch默认使用mmapfs目录来存储索引。操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存:
sysctl -w vm.max_map_count=262144
创建Elasticsearch数据挂载路径:
mkdir -p /febs/elasticsearch/data
对该路径授予777权限:
chmod 777 /febs/elasticsearch/data
创建Elasticsearch插件挂载路径:
mkdir -p /febs/elasticsearch/plugins
创建Logstash配置文件存储路径:
mkdir -p /febs/logstash
在该路径下创建logstash-febs.conf配置文件(没有安装vim的话可以使用yum install vim命令安装):
vim /febs/logstash/logstash-febs.conf
内容如下所示:
input {tcp {mode => "server"host => "0.0.0.0"port => 4560codec => json_lines}}output {elasticsearch {hosts => "es:9200"index => "febs-logstash-%{+YYYY.MM.dd}"}}
创建ELK Docker Compose文件存储路径:
mkdir -p /febs/elk
在该目录下创建docker-compose.yml文件:
vim /febs/elk/docker-compose.yml
内容如下所示:
version: '3'services:elasticsearch:image: elasticsearch:6.4.1container_name: elasticsearchenvironment:- "cluster.name=elasticsearch" #集群名称为elasticsearch- "discovery.type=single-node" #单节点启动- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #jvm内存分配为512MBvolumes:- /febs/elasticsearch/plugins:/usr/share/elasticsearch/plugins- /febs/elasticsearch/data:/usr/share/elasticsearch/dataports:- 9200:9200kibana:image: kibana:6.4.1container_name: kibanalinks:- elasticsearch:es #配置elasticsearch域名为esdepends_on:- elasticsearchenvironment:- "elasticsearch.hosts=http://es:9200" #因为上面配置了域名,所以这里可以简写为http://es:9200ports:- 5601:5601logstash:image: logstash:6.4.1container_name: logstashvolumes:- /febs/logstash/logstash-febs.conf:/usr/share/logstash/pipeline/logstash.confdepends_on:- elasticsearchlinks:- elasticsearch:esports:- 4560:4560
切换到/febs/elk目录下,使用如下命令启动:
docker-compose up -d
第一次启动的时候,Docker需要拉取ELK镜像,过程可能稍慢,耐心等待即可。成功启动后,观察容器运行情况:

三个容器都已经启动成功。
Logstash中安装json_lines插件
使用如下命令进入到Logstash容器中:
docker exec -it logstash /bin/bash
切换到/bin目录,安装json_lines插件,然后退出:

使用浏览器访问http://192.168.33.10:5601便可以看到Kibana管理界面:

修改微服务日志配置
就目前微服务模块来说,我们比较关注febs-auth、febs-gateway、febs-server-system和febs-server-test模块的日志,所以我们分别在febs-auth、febs-gateway和febs-server模块的pom里引入Logstash依赖:
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.1</version></dependency>
然后在febs-auth、febs-gateway、febs-server-system和febs-server-test模块的日志配置文件logback-spring.xml里添加如下配置:
<!--输出到 logstash的 appender--><appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>192.168.33.10:4560</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/></appender>......<root level="info">......<appender-ref ref="logstash" /></root>
192.168.33.10:4560对应我们刚刚搭建的Logstash地址。
演示
依次启动febs-register、febs-gateway、febs-auth、febs-server-system和febs-server-test模块,然后回到Kibana管理界面创建Kinaba Index Patterns:

在Index pattern里输入我们在logstash配置文件logstash-febs.conf里output.index指定的值febs-logstash-*:

点击Next Step,在下拉框里选择@timestamp:

最后点击Create Index Pattern按钮完成创建。
使用PostMan获取令牌:

然后发送一笔localhost:8301/test/hello?name=夏天请求:

在Kibana里搜索这笔日志:


日志收集成功。
整合ELK后,我们的系统架构图如下所示:

相关文章:
ELK日志收集
目前,各个微服务系统的日志都保存在各自指定的目录中,如果这些微服务部署在不同的服务器上,那么日志文件也是分散在各自的服务器上。分散的日志不利于我们快速通过日志定位问题,我们可以借助ELK来收集各个微服务系统的日志并集中展…...
常见docker命令
1、查询已安装docker中某个image依赖包 docker run -it --rm --name my-python-container 【python37:v001】 /bin/bash 【】改成自己环境名字 docker run -it --name lane python37_test:v006 /bin/bash lane是容器名字,python37_test:v006 是镜像名 开启容器 do…...
测试新人刚入行,该如何规划以后的发展路径?
作为一个刚入行的测试新人,应该如何规划自己的职业发展路径?如何规划自己的技术路线?软件测试的段位都有哪些?他们之间的薪资差异如何? 听说这些问题,是目前想要入行软件测试的同学们最关心的。那么我们今…...
Boosting Object Detection with Zero-Shot Day-Night Domain Adaptation
摘要:低亮度场景检测是一个小众且重要的方向,首先在于数据集和过往的研究都集中在光照充足的环境下,其次如果使用传统的训练方法的话由于训练难度大,模型效果也不会很好,有幸的是,现在关于低亮度的研究已经…...
Chromium html<lable>c++接口定义
HTML <label> 元素(标签)表示用户界面中某个元素的说明。 1、<label> 在html_tag_names.json5中接口定义: (third_party\blink\renderer\core\html\html_tag_names.json5) {name: "label",inte…...
QT中中文显示乱码问题
在VS2013中用QT开发GUI应用程序,Qt中显示中文乱码 一: //解决QT中中文显示乱码问题 #pragma execution_character_set("utf-8") 二:在main函数中添加以下代码: #include <QTextCodec>void main() {QTextCod…...
[面试常见]Javascript基础知识
#1024程序员节|征文# Object.assign 和对象扩展运算符有什么区别?是深拷贝还是浅拷贝? 都进行浅拷贝,只赋值对象的第一层属性,而不会递归复制整个对象结构 **const mergedObj Object.assign({},obj1,obj2) JavaScript 中 Map 和 Object 的区别是什么?…...
使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
ExcelIgnoreUnannotated 注解用于在使用 Apache POI 或其他 Excel 处理库时,指示在导出 Excel 时忽略没有被标注的字段。这意味着只有被特定注解(如 ExcelProperty)标注的字段会被处理和导出。 作用 简化导出过程:只导出需要的字…...
线程的同步
目录 引入 认识条件变量 快速认识接口编辑 认识条件变量编辑 测试代码编辑 生产消费模型 为何要使用生产者消费者模型 理解 编写生产消费模型 BlockingQueue 单生产单消费 多生产多消费 引入 同步:在保证数据安全的前提下,让线程…...
【启明智显分享】ZX7981PG/ZX7981PM融入官方OpenWrt,启明智显SDK/官方OpenWrt任由选择!
好消息!好消息!启明智显ZX7981PG和ZX7981PM正式融入官方 OpenWrt 的大家庭啦!现在开发者不仅可以基于启明智显的SDK进行二次开发,还可以直接应用官方OpenWrt以及我们的开源资料进行开发! 借助OpenWrt的强大生态&…...
如何用java发送包含表格形式的邮件
问题: 如何用java发送包含表格形式的邮件? 方法: 发用freemaker工具来替换html的表格变量,从而动态生成了html。然后再发送这个html格式(不能用纯文本)文本即可。 优化流程: 1、准备模板&#x…...
讲个故事:关于一次接口性能优化的心里路程
这是一个程序猿写的第一个故事,请各位懂行的客官静下心来,慢慢品读。就知道我为什么要单独写一个文章来记录这次过程了,因为实在是太坎坷了...... 背景介绍 近期项目投产时遇到一个问题,投产后在验证时发现大部分用户系统登…...
Centos7升级到openssh9.9
openssh9.9 是2024.9.20出的最新版ssh。因为客户扫描出一大堆centos7的漏洞,全是这个openssh的,好多补丁,所以索性升级到最新版。 需要自己制作rpm包,这个我是不懂,照这个来: Linux服务器升级openssh9.9最…...
使用 STM32F407 串口实现 485 通信
准备工作 了解485通信基本概念与原理:RS485通信详解_485通讯de接什么口-CSDN博客 安装编译软件:keil uVision 5.6 软件资料:STM32CubeF4 固件包,正点原子RS485通信例程 参考视频:第26讲 基础篇-新建H…...
基于NERF技术重建学习笔记
NeRF(Neural Radiance Fields)是一种用于3D场景重建的神经网络模型,能够从2D图像生成逼真的3D渲染效果。它将场景表征为一个连续的5D函数,利用了体积渲染和神经网络的结合,通过学习光线穿过空间时的颜色和密度来重建场…...
webView 支持全屏播放
webView 支持全屏播放 直接上代码 public class CustomFullScreenWebViewClient extends WebChromeClient {WebView webView;Context context;/*** 视频全屏参数*/protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS new FrameLayout.LayoutParams(ViewG…...
QGIS之三十二DEM地形导出三维模型gltf
效果 1、准备数据 (1)dem.tif (2)dom.tif 2、qgis加载dem和dom数据 3、安装插件 插件步骤可以参考这篇文章 QGIS之二十四安装插件 安装了Qgis2threejs插件,结果...
【python爬虫】携程旅行景点游客数据分析与可视化
一.选题背景 随着旅游业的快速发展,越来越多的人选择通过互联网平台预订旅行产品,其中携程网作为国内领先的在线旅行服务提供商,拥有大量的旅游产品和用户数据。利用爬虫技术可以获取携程网上各个景点的游客数据,包括游客数量、游…...
python实现onvif协议下控制摄像头变焦,以及融合人形识别与跟踪控制
#1024程序员节 | 征文# 这两天才因为项目需要,对网络摄像头的视频采集以及实现人形识别与跟踪技术。对于onvif协议自然起先也没有任何的了解。但是购买的摄像头是SONY网络头是用在其他地方的。因为前期支持探究项目解决方案,就直接拿来做demo测试使用。 …...
【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用
上篇文章: 【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间&…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
