当前位置: 首页 > news >正文

通过ELK+kafka采集微服务日志

在springboot微服务中采集日志推送kafka

  • 背景
    • 整体流程图
  • 快速搭建kafka+zk开发环境
  • 通过logback记录日志到kafka
  • 快速搭建ELK环境
  • Kibana查看,统计日志

背景

在分布式的项目中,各功能模块产生的日志比较分散,同时为满足性能要求,同一个微服务会集群化的部署,当某一次业务中报错后,如果不能确定产生的节点,那么只能逐个节点去查看日志文件,logback中RollingFileAppender,ConsoleAppender这类同步化记录器也降低系统性能,综上一些问题,可能考虑采用ELK (elasticsearch+logstash+kibana)配合消息中间件去异步采集,统一展示去解决。

这里采用kafka 去作为消息中间件异步推送日志

整体流程图

流程图:

Created with Raphaël 2.3.0开始logback记录日志推送kafkalogstash拉取消息并清洗推送elasticsearchkibana展示结束

快速搭建kafka+zk开发环境

在任意宿主机上创建一个docker-compose.yml文件,将内容复制进去,替换一下ip.我这里宿主机IP为192.168.1.149

vi docker-compose.yml #这里将下面内容复制进去,然后wq保存退出
docker-compose up -d  #启动服务 ,这里一定要cd到docker-compose.yml同级目录再执行

docker-compose.yml内容如下

version: "2"services:zookeeper:image: docker.io/bitnami/zookeeper:3.8ports:- "2181:2181"environment:- ALLOW_ANONYMOUS_LOGIN=yesnetworks:- es_defaultkafka:image: docker.io/bitnami/kafka:3.2user: rootports:- "9092:9092"environment:- ALLOW_PLAINTEXT_LISTENER=yes- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.149:9092  #这里替换为你宿主机IP或host,在集群下,各节点会把这个地址注册到集群,并把主节点的暴露给客户端,不要注册localhost
#      - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092depends_on:- zookeepernetworks:- es_default
networks:es_default:name: es_default
#    external: true
volumes:zookeeper_data:driver: localkafka_data:driver: local

通过logback记录日志到kafka

引用kafka-clients依赖,注意版本最好跟服务端一致

        <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.2.0</version></dependency>

Springboot中默认采用的logback实现日志记录,因此可以仿照ConsoleAppender,去承继OutputStreamAppende在项目中创建一个基于Kafka记录日志的KafkaAppender,最好是独立一个日志模块,方便其它业务模块引用

我这里可能开发机性能的问题,有个奇怪的问题,必须要调整一下max.block.ms ,即降低消息阻塞时间,否则我这会经常性阻塞60秒(默认值)

package com.kuizii.base.log;import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.OutputStreamAppender;
import ch.qos.logback.core.util.EnvUtil;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.springframework.util.StringUtils;import java.io.OutputStream;
import java.util.Properties;public class KafkaAppender<E> extends OutputStreamAppender<E> {private Producer logProducer;private  String bootstrapServers;    private 	Layout<E> layout; 	private  String topic;public void setLayout(Layout<E> layout) {this.layout = layout;}public void setBootstrapServers(String bootstrapServers) {this.bootstrapServers = bootstrapServers;}public void setTopic(String topic) {this.topic = topic;}@Overrideprotected void append(E event) {if (event instanceof ILoggingEvent) {String msg = layout.doLayout(event);ProducerRecord<String, String> producerRecord = new ProducerRecord<>(topic, 0,((ILoggingEvent) event).getLevel().toString(), msg);logProducer.send(producerRecord);}}@Overridepublic void start() {if (StringUtils.isEmpty(topic)) {topic = "Kafka-app-log";}if (StringUtils.isEmpty(bootstrapServers)) {bootstrapServers = "localhost:9092";}logProducer = createProducer();OutputStream targetStream = new KafkaOutputStream(logProducer, topic);super.setOutputStream(targetStream);super.start();}@Overridepublic void stop() {super.stop();if (logProducer != null) {logProducer.close();}}//创建生产者private Producer createProducer() {synchronized (this) {if (logProducer != null) {return logProducer;}Properties props = new Properties();props.put("bootstrap.servers", bootstrapServers);//判断是否成功,我们指定了“all”将会阻塞消息 0.关闭 1.主broker确认 -1(all).所在节点都确认props.put("acks", "0");//失败重试次数props.put("retries", 0);//延迟100ms,100ms内数据会缓存进行发送props.put("linger.ms", 100);//超时关闭连接//props.put("connections.max.idle.ms", 10000);props.put("batch.size", 16384);props.put("buffer.memory", 33554432);//该属性对性能影响非常大,如果吞吐量不够,消息生产过快,超过本地buffer.memory时,将阻塞1000毫秒,等待有空闲容量再继续props.put("max.block.ms",1000);props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");return new KafkaProducer<String, String>(props);}}}

然后在各业务需要记录日志的模块中配置logback.xml
在logback.xml中添加一个KafkaAppender,如下所示:

 <appender name="kafkalog" class="com.kuizii.base.log.KafkaAppender"><bootstrapServers>192.168.1.149:9092</bootstrapServers><topic>demoCoreKafkaLog</topic><encoder><pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern><charset>utf8</charset></encoder><layout class="ch.qos.logback.classic.PatternLayout"><pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern></layout></appender>

启动系统,日志将被写入kafka队列 ,等待logstash消费并推送ES ,当然其实也可以直接推送ES,不足Kafka为的就是提高性能。

快速搭建ELK环境

接下来将创建Elasticsearch+Kibana+Logstash+Merticbeat.四个工具,用途如下

Elasticsearch采用restful接收http请求调用lucene建立索引作全文检索
Kibana展示日志,图表,看板
Merticbeat对各工具将于指标监控,比如内存,CPU,IO,这里不多讲
Logstash用于从各数据源获取数据,清理,过滤,转换后发给另一数据源。
我这里elasticsearch 7.11.*版本的授权license对云服务商之类要商用的有开源限制,一般商用不影响,我这里采用的7.10.1

我们需要先创建一个logstash工作任务,目前将我们kafka中的日志消息获取出来 ,再推送给elasticsearch。在宿主机上创建一个任务文件,如logstash.conf内容如下


input {kafka {bootstrap_servers => "192.168.1.149:9092"  #kafka的地址,替换为你自己的client_id => "logstash"  auto_offset_reset => "latest"  consumer_threads => 5topics => ["demoCoreKafkaLog","webapiKafkaApp"]  #获取哪些topictype => demo   #自定义
#    codec => "json"}
}output {stdout {  }elasticsearch {hosts => ["http://elasticsearch:9200"]  #es地址,这里由于上面docker-compose中几个服务在一个虚拟网络在,可以用服务名代替index => "demolog-%{+YYYY.MM.dd}"    #这里将会是创建的索引名,后续 kibana将会用不同索引区别#user => "elastic"#password => "changeme"}
}

然后还是定义一个docker-compose.yml,然后docker-compose up -d 去创建服务容器

version: "2"services:elasticsearch:image: elasticsearch:7.10.1restart: alwaysprivileged: trueports:- "9200:9200"- "9300:9300"volumes:- "/d/workspace/es/data:/usr/share/elasticsearch/data"environment:- discovery.type=single-nodenetworks:- es_defaultkibana:image: kibana:7.10.1restart: alwaysprivileged: trueports:- "5601:5601"environment:- ELASTICSEARCH_URL=http://elasticsearch:9200depends_on:- elasticsearchnetworks:- es_defaultmetricbeat:image: elastic/metricbeat:7.10.1restart: alwaysuser: rootenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200depends_on:- elasticsearch- kibanacommand:  setup -E setup.kibana.host=kibana:5601  -E output.elasticsearch.hosts=["elasticsearch:9200"] -E setup.ilm.overwrite=truenetworks:- es_defaultlogstash:image: elastic/logstash:7.10.1restart: alwaysuser: rootvolumes:- /d/workspace/logstash/pipeline/:/usr/share/logstash/pipeline/  #这里将冒号前段的路径改为宿主机的路径,用于存放转换任务depends_on:- elasticsearch- kibananetworks:- es_default
networks:es_default:driver: bridgename: es_default

创建完成,稍等各服务启动完成,有点慢,可能一两分钟,然后通过 http://host:9200访问es,看是否成功
在这里插入图片描述
http://host:5601访问kibana.
在这里插入图片描述

docker logs [logstash容器名] 查看logstash的日志,如下,已经接收到了Kafka的消息。
在这里插入图片描述
最后,就可以在kibana中展示了。

Kibana查看,统计日志

访问 http://kibana:5601。在如下进入索引管理
在这里插入图片描述
点击创建索引模式,准备或模糊匹配索引名称,然后完成创建
在这里插入图片描述
在这里插入图片描述
最后,创建一个展示页如图
在这里插入图片描述
如下1中选择刚刚创建的索引模式,2中选择要展示的字段 ,右侧就可以看到各微服务中收集的日志了,右上保存,以后便可以直接使用了。
至于想要高级的使用技巧,可以深入查看kibana教程,如我有空,可能也会写相关文章。
在这里插入图片描述

最后,KafkaAppender源码如下
源码链接

相关文章:

架构每日一学 9:架构师要学会构建或寻找一个友善的环境

本文首发于公众平台:腐烂的橘子前面的文章中,我们讲到了成为架构师的四个生存法则:法则一:架构每日一学 2:架构师六个生存法则之一:架构必须有且仅有一个目标(一)法则二:架构每日一学 4:成为首席架构师,你必须学会顺应人性法则三:架构每日一学 6:成为架构师,你必…...

郑州2024 ccpc 赛后总结 zhz

本次参加第六届CCPC省赛没有取得一个令人满意的成绩,有如下几个原因:(1)平时练题不够,见到题目的时候不能快速地剥离出模型,以及对算法模型的理解不够深刻。例如,在完成B题时候,看到诸如“购买任意次”, “最优解” 等等关键词我便理所应当的认为是DP里面的完全背包模…...

Boost库安装与使用(Windows)

一、关键词 Boost 二:安装 1、到官网[https://www.boost.org/]下载,我下载的是1.83 2、解压后点击 bootstrap.bat,会生成可执行程序-b2.exe 3、双击运行b2.exe自动编译,编译一般在2小时内。 三、实际运用本文来自博客园,作者:Labant,转载请注明原文链接:https://www.cn…...

64-SpringBoot源码分析

Starter 是什么? 我们如何使用这些 Starter? 为什么包扫描只会扫描核心启动类所在的包及其子包? 在 SpringBoot 启动过程中,是如何完成自动配置的? 内嵌 Tomcat 是如何创建并启动的? 引入了 web 场景对应的 Starter,SpringMVC 是如何完成自动装配的?1. 源码环境构建 ht…...

力扣-96. 下一个更大元素 I

1.题目 题目地址(496. 下一个更大元素 I - 力扣(LeetCode)) https://leetcode.cn/problems/next-greater-element-i/ 题目描述 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,…...

【吐槽】今天才发现PyCharm不支持对Python脚本进行块注释

在PyCharm中对Python脚本Ctrl + Shift + /进行块注释不起作用,然后使用OpenArk64查看是否热键占用冲突,没有发现其他占用。 然后发现PyCharm中Code菜单项下的选项Comment with Block Comment是灰色的。 又查了下,最后发现jetbrains官方帮助文档中已说明PyCharm不支持对Pytho…...

通过ELK+kafka采集微服务日志

在springboot微服务中采集日志推送kafka背景整体流程图快速搭建kafkazk开发环境通过logback记录日志到kafka快速搭建ELK环境Kibana查看&#xff0c;统计日志背景 在分布式的项目中&#xff0c;各功能模块产生的日志比较分散&#xff0c;同时为满足性能要求&#xff0c;同一个微…...

开启新航路,拓尔思发力AIGC市场 | 爱分析调研

2022年&#xff0c;随着AI聊天机器人GhatGPT在世界范围内持续火爆&#xff0c;极具创意、表现力、个性化且能快速迭代的AIGC技术成功破圈&#xff0c;成为全民讨论热点。 AIGC是指在确定主题下&#xff0c;由算法模型自动生成内容&#xff0c;包括单模态内容如文本、图像、音频…...

01-死磕QNX someip

1. vsomeip3.1.20版本 环境配置 export COMMONAPI_CONFIG/etc/commonapi.ini export LD_LIBRARY_PATH/sdcard/someip:$LD_LIBRARY_PATH export VSOMEIP_CONFIGURATION/etc/vsomeip-service.json export VSOMEIP_APPLICATION_NAMEHelloWorldSomeIPService sysctl -w net.ine…...

OTFS输入输出关系

目录 1. OTFS输入输出关系的矩阵表示 1.1 OTFS&#xff1a;矩阵表示 1.2 OTFS发射机的实现 1.2.1 传统的OTFS调制 ISFFT 海森堡变换 1.2.2 基于IDZT的OTFS调制 1.3 OTFS接收机的实现 1.3.1 传统的OTFS解调 维格纳变换 SFFT 1.3.2 基于DZT的OTFS解调 Appendix-Matlab C…...

Java的抽象类和接口

目录 一 、抽象类 1、抽象类概念 2、抽象类语法 3、抽象类特性 4、抽象类的作用 二、接口 1、接口的概念 2、语法规则 3、接口使用 4、接口特性 5、实现多个接口 6、接口间的继承 7、抽象类和接口的区别 8、接口使用实例 9、Clonable 接口和深拷贝 三、Object类…...

作为一个女测试员是什么样的体验?

面试时极度紧张&#xff0c;语无伦次&#xff0c;觉得肯定没戏&#xff0c;最后却拿到高薪offer。 工作之后我听同事们讲&#xff0c;测试总监面试官并没打算要我&#xff0c;但身边的人都问他&#xff1a; 那个小姐姐什么时候来报道&#xff1f;... 于是在众人的期待的目光…...

移动端 REM 适配

Vant 中的样式默认使用 px 作为单位&#xff0c;如果需要使用 rem 单位&#xff0c;推荐使用以下两个工具&#xff1a; postcss-pxtorem 是一款 postcss 插件&#xff0c;用于将单位转化为 rem lib-flexible 用于设置 rem 基准值 下面我们分别将这两个工具配置到项目中完成 R…...

哈希表【leetcode】

笔记&#xff1a;代码随想录 理论 概念 哈希表&#xff08;hash table&#xff0c;散列表&#xff09;&#xff1a;是根据关键码的值而直接访问的数据结构&#xff0c;说白&#xff0c;数组就是一张哈希表。 哈希函数&#xff1a;把变量直接映射为表上的索引。 哈希碰撞&a…...

【Gem5】有关gem5模拟器的资料导航

网上有关gem5模拟器的资料、博客良莠不齐&#xff0c;这里记录一些总结的很好的博客与自己的学习探索。 一、gem5模拟器使用入门 官方的教程&#xff1a; learning_gem5&#xff1a;包括gem5简介、修改扩展gem5的示例、Ruby相关的缓存一致性等。gem5 Documentation&#xff1…...

R语言中apply系列函数详解

文章目录applylapply, sapply, vapplyrapplytapplymapplyR语言的循环效率并不高&#xff0c;所以并不推荐循环以及循环嵌套。为了实现循环功能的情况下&#xff0c;兼顾效率&#xff0c;R语言提供了apply系列函数&#xff0c;用于对规则的数据进行函数式的迭代处理。 apply a…...

AOP的另类用法 (权限校验自定义注解)

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 AOP的另类用法 (权限校验&&自定义注解) 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649…...

【机器学习】机器学习建模调参方法总结

文章目录一、前言1.1 数据来源1.2 理论简介二、知识总结2.1 回归分析2.2 长尾分布2.3 欠拟合与过拟合2.4 正则化2.5 调参方法2.5.1 贪心调参 &#xff08;坐标下降&#xff09;2.5.2 网格调参GridSearchCV2.5.3 贝叶斯调参三、建模与调参3.1 线性回归3.1.1 模型建立3.1.2 查看训…...

Python数据分析师|Pandas之基础知识

版权声明&#xff1a;原创不易&#xff0c;本文禁止抄袭、转载&#xff0c;侵权必究&#xff01; 目录一、数据分析简介二、数据分析简介三、数据查看四、知识总结五、作者Info一、数据分析简介 随着科技的发展&#xff0c;数据变得尤为重要&#xff0c;甚至有着“数据为王”&…...

macOS 13.3(22E252)/12.6.4/11.7.5正式版发布

系统介绍 3 月 28 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.3 更新&#xff08;内部版本号&#xff1a;22E252&#xff09;苹果今天还发布了macOS Monterey 12.6.4和macOS Big Sur 11.7.5&#xff0c;本次更新距离上次发布隔了 42 天。 macOS Ventura 带来…...

速度与兼容性功能大比拼:7款浏览器测评,哪一款更好用

还在为使用哪款浏览器而发愁吗&#xff1f;电脑配置低&#xff0c;又想浏览网页顺畅、下载速度快&#xff0c;那么就要挑选功能齐全、速度快的浏览器。话不多说&#xff0c;给大家做了7款浏览器的最全测评&#xff0c;看看2023年哪个浏览器更好用&#xff0c;更适合自己。 本次…...

【建议收藏】2023年中高级软件测试大厂面试秘籍,为你保驾护航金三银四,直通大厂

前言 从几十份顶级面试仓库和300多篇高质量面经中总结出一份全面成体系化的软件测试高级面试题集。 随着软件测试岗位技术发展的成熟&#xff0c;自动化、性能、框架等一下子就进入了我们的视野内&#xff0c;同时&#xff0c;软件测试自身的技术栈也正在不断扩展&#xff0c…...

Cinema 4D 2023.1.3安装包下载及安装教程

[软件名称]:Cinema 4D 2023.1.3 [软件大小]: 1.0GB [安装环境]: Win11/Win 10 [软件安装包下载]: https://pan.quark.cn/s/c2324deaa028 CINEMA 4D字面意思是4D电影&#xff0c;不过其本身就是3D的表现软件&#xff0c;由德国Maxon Computer开发&#xff0c;以极高的运算速度和…...

IDEA vs Eclipse:使用体验对比

1. 概述 IDEA 和 Eclipse 都是常见的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编写和调试代码。它们都有一些共同的功能&#xff0c;例如代码编辑器、调试器、版本控制等等。但是在具体的使用体验上&#xff0c;它们有很多不同之处。 本文将对 IDEA 和 Eclip…...

新手学SpringCloud前需知道的5点

目录 第一点&#xff1a; 什么是微服务架构 第二点&#xff1a;为什么需要学习Spring Cloud 第三点&#xff1a; Spring Cloud 是什么 第四点&#xff1a; SpringCloud的优缺点 1、SpringCloud优点 2、SpringCloud缺点 第五点&#xff1a; SpringCloud由什么组成 1&…...

Java集合—HashMap为什么2倍扩容 、HashMap的key允许空值而Hashtable却不允许

目录 1. Java集合—HashMap为什么2倍扩容 1.1 从源码分析 2. 为什么HashMap的key允许空值&#xff0c;而Hashtable却不允许 2.1 从源码分析 1. Java集合—HashMap为什么2倍扩容 HashMap的初始容量都是2的n次幂的形式存在的&#xff0c;而扩容也是2倍的原来的容量进行扩容&a…...

国内、外(翻)的新闻网站推荐

也许有很多朋友和我一样&#xff0c;小小螺丝天天关注国家大事&#xff0c;总喜欢在茶余饭后关注下国内外新闻&#xff0c;除了新闻广播和电视之外还能有哪些方式呢&#xff1f;今天就给大家盘点总结一下。 一、国内 1.今日头条&#xff1a;链接&#xff1a;今日头条 推荐等…...

PHP初级教程------------------(2)

目录 运算符 赋值运算符 算术运算符 比较运算符 逻辑运算符 连接运算符 错误抑制符 三目运算符 自操作运算符 ​编辑 计算机码 位运算符 运算符优先级 流程控制 控制分类 顺序结构 分支结构 If分支 ​ Switch分支 循环结构 For循环 while循环 do-while循环 循环控制 ​ …...

js的递归函数——实现可收放的树形菜单

递归函数实现树形菜单创建假数据或者请求接口数据定义递归函数&#xff0c;处理数据调用函数&#xff0c;渲染页面效果展示完整代码树形菜单是一种常见的网站导航方式&#xff0c;它通常由多个层级的菜单项组成&#xff0c;每个菜单项可以有子菜单项。在JavaScript中&#xff0…...

如何高效搭建资产管理平台?众安科技告诉你答案是图技术

本⽂整理⾃ NebulaGraph x 阿⾥云计算巢专场中众安保险的⼤数据应⽤⾼级专家曾⼒带来的《众安资产在 NebulaGraph 的应⽤实践》分享&#xff0c;视频⻅链接。 ⼤家好&#xff0c;我是众安数据科学应⽤中⼼的曾⼒&#xff0c;今天很⾼兴在这⾥可以跟⼤家分享 NebulaGraph 在众安…...

使用mybatis-plus-generator配置一套适合你的CRUD

1、maven引入 mybatis-plus-generator 和模板引擎&#xff0c;你也可以使用freemarker之类的&#xff0c;看个人 <!-- mybatisplus代码生成器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactI…...

vue门户网站,滚动到可视化区域展示动画效果方案

1.准备两个工具库&#xff1a; &#xff08;1.1&#xff09; animate.css&#xff1a;动画库 &#xff08;动画效果展示&#xff1a;Animate.css | A cross-browser library of CSS animations.&#xff09; &#xff08;1.2&#xff09;wowjs: 负责滚动到可视化区域&#xff…...

【0180】PG内核读取pg_hba.conf并创建HbaLine记录(1)

文章目录 1. pg_hba.conf文件是什么?2. postmaster何时读取pg_hba.conf?2.1 pg内核使用pg_hba.conf完成客户端认证的原理2.2 读取pg_hba.conf的几个模块3. pg内核读取pg_hba.conf过程3.1 VFD机制获取文件描述符3.2 根据fd读取文件内容相关阅读: 【0178】DBeaver、pgAdmin I…...

【五】线程安全VS线程不安全

1. Java内存模型的特征 Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立。下面逐个看下哪些操作实现这三个特性&#xff1a; 1.1 原子性&#xff08;Atomicity&#xff09; 由Java内存模型来直接保证的原子性变量操作包括 read、load、assig…...

【大屏设计方案】

大屏设计方案一、非等比放大(填充满整个屏幕)目的屏幕比例大小和设计稿的差的不多目的屏幕比例大小和设计稿的差很多二、等比放大&#xff08;比如16&#xff1a;9&#xff09;解决方案之后就可以用rem了&#xff0c;有两种便利的方式&#xff1a;也可以用media 根据不同的屏幕…...

input 标签原生实现数字选择器

在使用开源的UI框架时&#xff0c;实现数字选择器很容易&#xff0c;直接拷贝就行&#xff0c;如iview、elementui...等。但有时项目不使用第三方样式库&#xff0c;这样的话UI控件只能自己实现。笔者就遇到过这样的情况&#xff0c;自己实现数字选择器&#xff0c;下面分享下实…...

大数据项目实战之数据仓库:用户行为采集平台——第3章 用户行为日志

第3章 用户行为日志 3.1 用户行为日志概述 用户行为日志的内容&#xff0c;主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式&#xff0c;有代码…...

zookeeper 学习(一):简单认识zookeeper

zookeeper 学习(一)&#xff1a;简单认识zookeeper zk官网 zk是什么&#xff1f; highly reliable distributed coordination. 来自官网&#xff0c;高可用的分布式协调服务&#xff0c;应用最多的场景就是用来做其他服务中间件的协调者&#xff0c;我最开始接触zk &#xff0c…...

IP 归属用 Ip2region 就够了

文章目录Ip2region 简介是什么特性支持的编程语言案例实操依赖获取IP输入流转化解析IP测试抖音、微博、小红书等各平台相继上线" 网络用户IP地址显示功能"&#xff0c; 境外显示 国家&#xff0c; 境内显示到 省市&#xff0c;且该功能无法关闭&#xff0c;IP地址为强…...

最小生成树kruskal-修建公路1

题目描述 L 城一共有 N 个小区。 小明是城市建设的规划者,他计划在城市修 M 条路,每修建一条路都要支付工人们相应的工钱(需要支付的工钱 = 路的长度)。 然而小明所拿到的经费并不够支付修建 M 条路的工钱,于是迫于无奈,他只能将计划改变为修建若干条路,使得 N 个小区之…...

Linux常用命令汇总

一、文件和文件夹操作 1、进入某一文件夹&#xff1a; cd xxx/yyy/简便记忆&#xff1a;改变目录&#xff0c;change directory&#xff0c;cd 2、复制文件到另一个文件&#xff1a; cp xxx/xxx.yyy ddd/rrr.zzz简便记忆&#xff1a;复制&#xff0c;copy&#xff0c;cp 第…...

vue部署包可配置后台接口地址

有时候一个部署包可能要应用于不同服务器&#xff0c;这就需要频繁更换后台地址。 由此引申出了部署包可直接配置后台地址的需求&#xff0c;这样就不需要频繁打包了。 方法 1. public 新增 config.js 文件&#xff08;会被恶意修改地址&#xff0c;不安全&#xff09; publi…...

企业电子采购系统:采购过程更规范,更透明

满足采购业务全程数字化&#xff0c; 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 电子招标采购&#xff0c;是指在网上寻源和采购产品和服务的过程。对于企业和企业主来说&#xff0c;这是个既省钱又能提高供应链效率的有效方法…...

php 修改服务器文件上传大小限制

输入docker cp mlfnginx:/etc/nginx/conf.d/pl.conf .输入vimpl.conf 修改nginx配置文件移动到图中所示位置client_max_body_size 按键盘”i”对图中的xxM修改成需要的大小&#xff0c;然后按”esc”&#xff0c;在按”:wq”&#xff0c;最后按回车键输入docker cp ./pl.con…...

PICO640红外探测器配置模块verilog

目录 一、PICO640 Introduction 二、实现代码 一、PICO640 Introduction PICO640 Gen2™ is a high resolution (640x480 pixels) infrared image sensor for military, surveillance or thermography applications. It makes use of the ULIS latest, state o…...

简单易懂 关于nextTick()的理解

前言 学习Vue的过程中&#xff0c;大家肯定都使用过nextTick()&#xff0c;关于nextTick()的使用时机&#xff0c;大家肯定都知道&#xff0c;那么它的工作原理是怎样的呢&#xff0c;本文就简单说一下它的nextTick()的工作原理。 nextTick的使用时机 首先记住&#xff1a;n…...

第一节:auto.js开发环境搭建

相关学习文档&#xff1a;http://doc.autoxjs.com 一、下载并安装 Visual Studio Code 下载地址&#xff1a;https://code.visualstudio.com/ 二、安装 auto.js 插件 启动 Visual Studio Code按住 ctrlshift x输入Auto.js-Autox.js-VSCodeExt点击安装即可 三、启动 auto.…...

看他人代码小总结

针对几个功能类似的函数&#xff1a; 1.需要经常调试则定义一个参数比如is_debug来选择是否在调试&#xff0c;定义一些参数专门用于调试用&#xff0c;不用每次都修改这些参数&#xff0c;只需要修改is_debug这个参数&#xff1b; 2.把其中的变量(常量)单独拎出来放到一个文件…...

第四季新星计划即将开启,博客之星取消拉票你怎么看?

catalogue&#x1f31f; 写在前面&#x1f31f; 线下创机遇&#x1f31f; 新星计划&#x1f31f; 做导师可以得到什么&#x1f31f; 新星计划跟原力计划有何不同&#xff1f;&#x1f31f; 博客之星新玩法你怎么看&#xff1f;&#x1f31f; 写在前面 哈喽&#xff0c;大家好&…...

AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费

一、lexica.art 该网站拥有数百万Stable Diffusion案例的文字描述和图片&#xff0c;可以为大家提供足够的创作灵感。 使用上也很简单&#xff0c;只要在搜索框输入简单的关键词或上传图片&#xff0c;就能为你提供大量风格不同的照片。点击照片就能看到完整的AI关键词&#…...

数据分析之Pandas(2)

3.Pandas 文章目录3.Pandas3.3 Pandas进阶3.3.1 数据重塑和轴向旋转&#xff08;1&#xff09;层次化索引Series的层次化索引DataFrame的层次化索引层次化——电影数据示列&#xff08;2&#xff09;数据旋转3.3.2 数据分组、分组运算3.3.3 离散化处理3.3.4 合并数据集&#xf…...

推荐人工智能领域十大类专业好用的深度学习预训练模型

深度学习领域出现了许多优秀的预训练模型。以下是一些常用的专业深度学习预训练模型: 图像分类模型: VGG(Visual Geometry Group)系列:VGG16、VGG19等 ResNet(Residual Network)系列:ResNet50、ResNet101等 Inception(Google Inception)系列:InceptionV3、Incepti…...

App 抓包提示网络异常怎么破?

背景 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例&#xff1a; Fiddler中看到的请求是这样的&#xff1a; 你可能开始找证书的问题&#xff1a;是…...

Leetcode217——是否存在重复数字

217. 存在重复元素难度简单969收藏分享切换为英文接收动态反馈给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。示例 1&#xff1a;输入&#xff1a;nums [1,2,3,1]输出&…...

【面试题系列】K8S面试题(二)

目录 问题&#xff1a; 1.什么是有状态服务&#xff1f;如何与无状态服务区分开来&#xff1f; 2.有哪些常见的有状态服务&#xff1f;它们的特点是什么&#xff1f; 3. 如何在 Kubernetes 中管理有状态服务&#xff1f; 4.如何进行有状态服务的伸缩&#xff1f; 5.如何实…...

【多线程】synchronized 原理

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录❄️一. 基本特点☁️二. 加锁工作过程❄️一. 基本特点 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.(自适应) 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成…...

C语言基础-多线程编程

在C语言中实现多线程编程通常依赖于特定的库或操作系统提供的API。最常见的两种方法是使用 POSIX 线程&#xff08;Pthreads&#xff09;API&#xff08;在类Unix系统上&#xff0c;如Linux或macOS&#xff09;或使用Windows API&#xff08;在Windows系统上&#xff09;。 使…...

DS高阶:跳表

一、skiplist 1.1 skiplist的概念 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为key或者key/value的查找模型。skiplist是由William Pugh发明的&#xff0c;最早出现于他在1990年发…...

Java 序列化

Java中的序列化是指将对象转换为字节序列,以便在网络上传输或者保存到文件系统中。反序列化则是将字节序列重新转换为对象。Java提供了内置的序列化机制,使得开发人员可以轻松地实现对象的序列化和反序列化。 Java序列化的特点和优点: 简单易用:Java提供了内置的序列化和反…...

亚信安全发布《2024年第一季度网络安全威胁报告》

亚信安全2024年第一季度网络安全威胁报告 一季度威胁概览 《亚信安全2024年第一季度网络安全威胁报告》的发布旨在从一个全面的视角解析当前的网络安全威胁环境。此报告通过详尽梳理和总结2024年第一季度的网络攻击威胁&#xff0c;目的是提供一个准确和直观的终端威胁感知。…...

学习笔记——字符串(单模+多模+练习题)

单模匹配 Brute Force算法&#xff08;暴力&#xff09; 算法思想 母串和模式串字符依次配对&#xff0c;如果配对成功则继续比较后面位置是否相同&#xff0c;如果出现匹配不成功的位置&#xff0c;则j&#xff08;模式串当前的位置&#xff09;从头开始&#xff0c;i&…...

阿里云学习笔记2

企业应用服务 目录 域名以及DNS内容分发网络CDN云监控...

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的&#xff0c;它针对稠密向量数据集的相似搜索而设计&#xff0c;能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片&#xff0c;流式数据插入&#xff0c;动态schema&#xff0c…...

STM32HAL库-中断篇

中断 中断简介 中断是一种事件处理机制&#xff0c;可以暂停主程序的运行&#xff0c;转而处理特定事件程序。 中断的作用和意义&#xff1a; 实时控制 在确定事件内对响应事件做出相应 故障处理 检测到故障需要第一时间处理 数据传输 如串口通信&#xff0c;不确定数…...

综合性练习-验证码

1. 验证码案例 随着安全性的要求越来越高,目前项目中很多都使用了验证码,验证码的形式也是多种多样,更复杂的图形验证码和⾏为验证码已经成为了更流⾏的趋势. 2. 需求 界面如下图所示 1. 页面生成验证码 2. 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳…...

王炸!OpenAI全新模型GPT-4o推出!免费使用,实时语音视频交互来了!

北京时间5月14日凌晨&#xff0c;OpenAI 春季新品发布会举行&#xff0c;新一代旗舰生成模型 GPT-4o来了。GPT-4o 的推出代表着技术进步的一大步&#xff0c;集成了文本、语音和图像三种模态&#xff0c;使人机交互更加自然和高效。 这样的话&#xff0c;目前可以使用的版本包括…...

C++笔试强训day24

目录 1.判断是不是平衡⼆叉树 2.最大子矩阵 3.小葱的01串 1.判断是不是平衡⼆叉树 链接 简单递归即可。 class Solution { public:// 高度int hight(TreeNode* pRoot){if (pRoot nullptr)return 0;int l hight(pRoot->left);int r hight(pRoot->right);return max…...

Springboot+Vue项目-基于Java+MySQL的火锅店管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...