【JavaEE进阶】 Spring Boot⽇志
文章目录
- 🎋关于日志
- 🚩为什么要学习⽇志
- 🚩⽇志的⽤途
- 🚩日志的简单使用
- 🎄打印⽇志
- 🚩程序中得到⽇志对象
- 🚩使⽤⽇志对象打印⽇志
- 🎍⽇志格式的说明
- 🚩⽇志级别的作用
- 🚩⽇志级别的分类
- 🚩⽇志级别的使⽤
- 🍀⽇志配置
- 🚩配置⽇志级别
- 🚩⽇志持久化
- 🚩配置⽇志⽂件分割
- 🎋配置⽇志格式
- 🎄更简单的⽇志输出
- ⭕总结
🎋关于日志
🚩为什么要学习⽇志
在没有学习spring时,我们可能使⽤ System.out.print 来打印⽇志了.通过打印⽇志来发现和定位问题,或者根据⽇志来分析程序的运⾏过程.
在Spring的学习中,也经常根据控制台的⽇志来分析和定位问题.随着项⽬的复杂度提升,我们对⽇志的打印也有了更⾼的需求,⽽不仅仅是定位排查问题.
⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求),也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好,⽇志持久化,后续进⾏数据分析等.
但是 System.out.print 不能很好的满⾜我们的需求,我们就需要使⽤⼀些专⻔⽇志框架(也就是专业的事情交给专业的⼈去做)
🚩⽇志的⽤途
⽇志除了发现问题,分析问题,定位问题等,⽇志还有很多⽤途
- 系统监控
监控现在⼏乎是⼀个成熟系统的标配,我们可以通过⽇志记录这个系统的运⾏状态,每⼀个⽅法的响应时间,响应状态等,对数据进⾏分析,设置不同的规则,超过阈值时进⾏报警.⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀
- 数据采集
数据采集是⼀个⽐较⼤的范围,采集的数据可以作⽤在很多⽅⾯,⽐如数据统计,推荐排序等.
- 数据统计:统计⻚⾯的浏览量(PV),访客量(UV),点击量等,根据这些数据进⾏数据分析,优化公司运营 策略
- 推荐排序:⽬前推荐排序应⽤在各个领域,我们经常接触的各⾏各业很多也都涉及推荐排序,⽐如购物,⼴告,新闻等领域.数据采集是推荐排序⼯作中必须做的⼀环,系统通过⽇志记录⽤⼾的浏览历史,停留时⻓等,算法⼈员通过分析这些数据,训练模型,给⽤⼾做推荐.
下图中的数据源,其中⼀部分就来⾃于⽇志记录的数据
- ⽇志审计
随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上.⽹络安全越来越受到⼤家的关注,系统安全也成为了项⽬中的⼀个重要环节,安全审计也是系统中⾮常重要的部分.国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求.通过系统⽇志分析,可以判断⼀些⾮法攻击,⾮法调⽤,以 及系统处理过程中的安全隐患
- ⽐如,⼤家平时都在做运营系统,其中运营⼈员在通过界⾯处理⼀些数据的时候,如果没有清楚的⽇志操作记录,⼀条数据被删除或者修改,你是⽆法找到是谁操作的,但是如果你做了相应的记录,该数据被谁删除或者修改就会⼀⽬了然.还有⼀些内部的违规和信息泄漏(⽐如客⼾信息被卖掉)现象出现后,如果未记录留存⽇志,为事后调查提供依据,则事后很难追查(⼀些公司查看客⼾的信息都会被记录⽇志,如果频繁查询也会报警
🚩日志的简单使用
Spring Boot项⽬在启动的时候默认就有⽇志输出,如下图所⽰:
接下来我们看一下我们自己使用System.out.print打印一个日志
@RestController
public class LoggerController {@RequestMapping("/logger")public String logger() {System.out.println("我是日志");return "日志打印成功!!!";}
}
可以看到,我们通过 System.out.print 打印的⽇志,⽐ SpringBoot 打印的⽇志缺少了很多信息.
SpringBoot内置了⽇志框架 SLF4J ,我们可以直接在程序中调⽤ SLF4J来输出⽇志
🎄打印⽇志
打印⽇志的步骤:
-
在程序中得到⽇志对象.
-
使⽤⽇志对象输出要打印的内容
🚩程序中得到⽇志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚LoggerFactory,如下代码所⽰:
private static Logger logger = LoggerFactory.getLogger(类名.class);
LoggerFactory.getLogger需要传递⼀个参数,标识这个⽇志的名称.这样可以更清晰的知道是哪个类输出的⽇志.当有问题时,可以更⽅便直观的定位到问题类
使用注意事项:
- Logger对象是属于org.slf4j包下的,不要导⼊错包.
🚩使⽤⽇志对象打印⽇志
⽇志对象的打印⽅法有很多种,这里我们先使⽤info()⽅法来输出⽇志,如下代码所⽰:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);;@RequestMapping("/logger")public String logger() {logger.info("======我是日志======");return "日志打印成功!!!";}
}
打印日志如下:
🎍⽇志格式的说明
日志的每一项代表着什么呢?
从上图可以看到,⽇志输出内容元素具体如下:
-
时间⽇期:精确到毫秒
-
⽇志级别:ERROR,WARN, INFO,DEBUG或TRACE
-
进程ID
-
线程名
-
Logger名(通常使⽤源代码的类名)
-
⽇志内容
🚩⽇志级别的作用
⽇志级别代表着⽇志信息对应问题的严重性,为了更快的筛选符合⽬标的⽇志信息.
试想⼀下这样的场景,假设你是⼀家2万⼈公司的⽼板,如果每个员⼯的⽇常⼯作和琐碎的信息都要反馈给你,那你⼀定⽆暇顾及.于是就有了组织架构,⽽组织架构就会分级,有很多的级别设置,如下图所⽰:
有了组织架构之后,就可以逐级别汇报消息了,例如:组员汇报给组⻓,组⻓汇报给研发⼀组,研发⼀组
汇报给Java研发,等等依次进⾏汇报.
⽇志级别⼤概是同样的道理,有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如只关注error级别的,就可以根据级别过滤出来error级别的⽇志信息,节约开发者的信息筛选时间
🚩⽇志级别的分类
⽇志的级别从⾼到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
-
FATAL:致命信息,表⽰需要⽴即被处理的系统级错误.
-
ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏.
-
WARN:警告信息,不影响使⽤,但需要注意的问题
-
INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等.
-
DEBUG:调试信息,需要调试时候的关键信息打印.
-
TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
这里需要注意一点:⽇志级别通常和测试⼈员的Bug级别没有关系.
- ⽇志级别是开发⼈员设置的,⽤来给开发⼈员看的.⽇志级别的正确设置,也与开发⼈员的⼯作经验有关.如果开发⼈员把error级别的⽇志设置成了info,就很有可能会影响开发⼈员对项⽬运⾏情况的判断.出现error级别的⽇志信息较多时,可能也没有任何问题.测试的bug级别更多是依据现象和影响范 围来判断
⽇志级别的顺序如下图所示:
级别越⾼,收到的消息越少
🚩⽇志级别的使⽤
⽇志级别是开发⼈员⾃⼰设置的.开发⼈员根据⾃⼰的理解来判断该信息的重要程度
针对这些级别,Logger对象分别提供了对应的⽅法,来输出⽇志
@PostConstruct
public String printLog() {logger.trace("================= 我是trace ===============");logger.debug("================= 我是debug ===============");logger.info("================= 我是info ===============");logger.warn("================= 我是warn ===============");logger.error("================= 我是error ===============");return "打印不同级别的⽇志" ;
}
由于SpringBoot默认的⽇志框架是Logback,Logback没有FATAL 级别,它被映射到 ERROR .
出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤,需要需要系统管理员紧急介⼊处理.通常情况下,⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.
打印结果如下:
我们发现,只打印了info,warn和error级别的⽇志
这就与⽇志级别的配置有关,⽇志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志,也就是info,warn和error.
🍀⽇志配置
上述讲的是⽇志的使⽤,⽇志框架还⽀持我们更灵活的输出⽇志,包括内容,格式等
🚩配置⽇志级别
⽇志级别配置只需要在配置⽂ 件中设置"logging.level"配置项即可,我们将默认输出级别改为debug 如下所⽰,
logging:level:root: debug
我们再次进行打印,看一看效果:
🚩⽇志持久化
以上的⽇志都是输出在控制台上的,然⽽在线上环境中,我们需要把⽇志保存下来,以便出现问题之后追溯问题.把⽇志保存下来就叫持久化.⽇志持久化有两种⽅式
-
配置⽇志⽂件名
-
配置⽇志的存储⽬录
配置文件文件名如下:
后⾯可以跟绝对路径或者相对路径
配置文件的储存目录如下:
logging:file:path: D:/temp
使用该配置,会在该目录下创建一个默认的spring.log的文件储存日志
注意:
- logging.file.name 和 logging.file.path 两个都配置的情况下,只⽣效其⼀,以logging.file.name 为准
🚩配置⽇志⽂件分割
如果我们的⽇志都放在⼀个⽂件中,随着项⽬的运⾏,⽇志⽂件会越来越⼤,需要对⽇志⽂件进⾏分割.
当然,⽇志框架也帮我们考虑到了这⼀点,所以如果不进⾏配置,就⾛⾃动配置。默认⽇志⽂件超过10M就进⾏分割x
配置项 | 说明 | 默认值 |
---|---|---|
logging.logback.rollingpolicy.file-name-pattern | ⽇志分割后的⽂件名格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.max-file-size | ⽇志⽂件超过这个⼤⼩就⾃动分割 | 10MB |
yml配置如下:
logging:file:name: D:/tmp/springboot.loglogback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
分割结果如下:
🎋配置⽇志格式
上面所看的配置格式都是默认的。
其实日志格式也是可以配置的。⽀持控制台和⽇志⽂件分别设置
配置项说明:
- %clr(表达式){颜⾊}设置输⼊⽇志的颜⾊⽀持颜⾊有以下⼏种:
• blue • cyan • faint • green • magenta • red • yellow - %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}}⽇期和时间–精确到毫秒
%d{}⽇期
${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}
⾮空表达式,获取系统属性LOG_DATEFORMAT_PATTERN ,若属性LOG_DATEFORMAT_PATTERN 不存在,则使⽤
-yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系统属性可以System.getProperty(“LOG_DATEFORMAT_PATTERN”) 获取
-
%5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE.
-
%t 线程名. %c 类的全限定名. %M method. %L 为⾏号.%thread 线程名称. %m 或者 %msg 显⽰输出消息. %n 换⾏符
-
%5 若字符⻓度⼩于5,则右边⽤空格填充. %-5 若字符⻓度⼩于5,则左边⽤空格填充. %.15 若字符⻓度超过15,截去多余字符.%15.15 若字符⻓度⼩于15,则右边⽤空格填充.若字符⻓度超过15,截去多余字符
更多的说明,点我查看
如果设置了颜色没有显示怎么办呢?
解决方法如下:
- 打开启动配置
- 添加VM options
- 添加VM options -Dspring.output.ansi.enabled=ALWAYS
- 重新启动程序,就发现控制台⽀持颜⾊了
🎄更简单的⽇志输出
每次都使⽤LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加⼀遍,lombok给我们提供了⼀种更简单的⽅式.
-
添加lombok框架⽀持
-
使⽤ @slf4j 注解输出⽇志
关于lombok的的使用与安装参考博主在【JavaEEj进阶】 Spring实现留言板中对lombok的使用
lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象log,我们直接使⽤就可以
实现代码如下:
@Slf4j
@RestController
public class LogController {@PostConstructpublic void log(){log.info("--------------我是要输出⽇志的内容----------------");}
}
⭕总结
- ⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot内容了⽇志框架,默认情况下使⽤的是info⽇志级别将⽇志输出到控制台的,我们可以通过lombok提供的@Slf4j 注解和 log 对象快速的打印⾃定义⽇志.
- ⽇志包含6个级别,⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志持久化
关于《【JavaEEj进阶】 Spring实现留言板》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!
相关文章:

【JavaEE进阶】 Spring Boot⽇志
文章目录 🎋关于日志🚩为什么要学习⽇志🚩⽇志的⽤途🚩日志的简单使用 🎄打印⽇志🚩程序中得到⽇志对象🚩使⽤⽇志对象打印⽇志 🎍⽇志格式的说明🚩⽇志级别的作用&#…...

《GitHub Copilot 操作指南》课程介绍
第1节:GitHub Copilot 概述 一、什么是 GitHub Copilot 什么是 GitHub Copilot GitHub Copilot是GitHub与OpenAI合作开发的编程助手工具,利用机器学习模型生成代码建议。它集成在开发者的集成开发环境(IDE)中,可以根…...

结构体(C语言)
结构体 1.结构体基础知识: //结构是一些值的集合,这些值称为成员变量. // 结构的每个成员可以是不同类型的变量. 2.结构的定义 struct peo { char name[10];//姓名 char tele[12];//电话 char gender[5];//性别 int high;//身高 }; struct stu { struct…...

HNU-数据挖掘-实验1-实验平台及环境安装
数据挖掘课程实验实验1 实验平台及环境安装 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验1 实验平台及环境安装实验背景实验目标实验步骤1.安装虚拟机和Linux平台,熟悉Ubuntu环境。2.在Linux平台上搭建Python平台,并安装…...

JavaEE中的监听器的作用和工作原理
在JavaEE(Java Platform, Enterprise Edition)中,监听器(Listener)是一种重要的组件,用于监听和响应Web应用程序中的事件。监听器的作用是在特定的事件发生时执行一些自定义的逻辑。常见的监听器包括Servle…...

Webpack5入门到原理1:前言
为什么需要打包工具? 开发时,我们会使用框架(React、Vue),ES6 模块化语法,Less/Sass 等 css 预处理器等语法进行开发。 这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、Css 等语法…...

#vue3 实现前端下载excel文件模板功能
一、需求: 前端无需通过后端接口,即可实现模板下载功能。 通过构造一个 JSON 对象,使用前端常用的第三方库 xlsx,可以直接将该 JSON 对象转换成 Excel 文件,让用户下载模板 二、效果: 三、源码如下&…...

《WebKit 技术内幕》之五(3): HTML解释器和DOM 模型
3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程:首先检测事件发生处的元素有无监听者,如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件(浏览器对于有些事件必须响应…...

136基于matlab的自适应滤波算法的通信系统中微弱信号检测程序
基于matlab的自适应滤波算法的通信系统中微弱信号检测程序,周期信号加入随机噪声,进行滤波,输出滤波信号,程序已调通,可直接运行。 136 matlab自适应滤波算法LMS (xiaohongshu.com)...

【Linux】权限 !
Linux 权限 Liunx Linux 权限1 什么是权限1.1 Linux用户1.2 切换用户 2 权限管理2.1 文件访问者的分类2.2 文件类型和访问权限2.3 文件权限的设置方法chmod 命令chown 命令chgrp 命令umask 命令file 指令 2.4 目录权限粘滞位 3 权限总结 1 什么是权限 关于Linux的权限问题&…...

axios原理
文章目录 axios基本概念axios多种方式调用工具函数axios的拦截器如何实现?用的设计模式是哪种?axios如何实现取消请求,和cancelToken如何使用 axios基本概念 axios是目前比较流行的一个js库,是一个基于promise的网络数据请求库&am…...

epoll
常用函数 //创建 /** * param size 告诉内核监听的数目 * * returns 返回一个epoll句柄(即一个文件描述符) */ int epoll_create(int size);//控制 /** * param epfd 用epoll_create所创建的epoll句柄 * param op 表示对epoll监控描述符控制的动作 * * …...

AEB滤镜再破碎,安全焦虑「解不开」?
不久前,理想L7重大交通事故,再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示,碰撞发生前3秒,车速在178km/h时驾驶员采取了制动措施,但车速大幅超出AEB(自动紧急刹车系统)的工作范…...

深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度?
深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度? 目录 深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度?引言1 数据预处理2 数据集增强3 特征选择4 模型选择5 模型正则化与泛化6 优化器7 学习率8 超…...

无限商机、拓全国、赢未来!2024上海国际轴承展重磅来袭!
中国设备管理协会主办的“2024上海国际轴承及其专用装备展览会”将于2024年7月24日至26日在“国家会展中心(虹桥)”举办。展会预计展出面积55000平方米,汇聚来自世界各地的近1000家企业与60000多人次的国内外观众齐聚一堂。为期三天的展览会是…...

PPT 编辑模式滚动页面不居中
PPT 编辑模式滚动页面不居中 目标:编辑模式下适应窗口大小、切换页面居中显示 调整视图大小,编辑模式通过Ctrl 鼠标滚轮 或 在视图菜单中点击适应窗口大小。 2. 翻页异常,调整视图大小后,PPT翻页但内容不居中或滚动,…...

笨蛋学设计模式结构型模式-享元模式【13】
结构型模式-享元模式 7.7享元模式7.7.1概念7.7.2场景7.7.3优势 / 劣势7.7.4享元模式可分为7.7.5享元模式7.7.6实战7.7.6.1题目描述7.7.6.2输入描述7.7.6.3输出描述7.7.6.4代码 8.1.7总结享元模式 7.7享元模式 7.7.1概念 享元模式是通过共享对象减少内存使用,来…...

磁盘的分区与文件系统的认识
磁盘的认识 了解磁盘的结构: 1、盘片 硬盘首先会有多个盘片构成,类似很多个独立的光盘合并在一起,每个盘片都有2个面,每个盘片都有一个对应的磁头,我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置,…...

韩国访问学者如何申请?
作为访问学者,前往韩国学术机构进行研究是一项令人期待的经历。首先,申请者需要查找目标学术机构的官方网站,下面知识人网小编带大家了解其访问学者计划的具体要求和申请流程。 通常,申请程序包括填写在线申请表格,提交…...

MybatisPlus框架入门级理解
MybatisPlus 快速入门入门案例常见注解常用配置 核心功能条件构造器自定义SQLService接口 快速入门 入门案例 使用MybatisPlus的基本步骤: 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能&#…...

ELK 分离式日志(1)
目录 一.ELK组件 ElasticSearch: Kiabana: Logstash: 可以添加的其它组件: ELK 的工作原理: 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件: 修改elasticsearch主配置文件&…...

<蓝桥杯软件赛>零基础备赛20周--第15周--快速幂+素数
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上交流答疑&am…...

Opencv小项目——手势数字刷TIKTOK
写在前面: 很久没更新了,之前的实习的记录也算是烂尾了,但是好在自己的实习记录还是有的,最近也忙碌了很多,终于放假了,今天下午正好没事,闲来无事就随便做个小玩意吧。 思来想去ÿ…...

【优化技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路
针对Java对象压缩及序列化技术的探索之路 序列化和反序列化为何需要有序列化呢?Java实现序列化的方式二进制格式 指定语言层级二进制格式 跨语言层级JSON 格式化类JSON格式化:XML文件格式化 序列化的分类在速度的对比上一般有如下规律:Java…...

Spring+SprinMVC+MyBatis配置方式简易模板
SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test,执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…...

Windows ssh登录eNSP交换机
目录 1. Cloud IO配置1.1 创建UDP端口1.2 创建本地连接1.3 端口映射设置 2. 交换机配置2.1 配置vlanif2.2 配置vty2.3 配置ssh用户2.4 配置aaa2.5 使用Xshell工具登录2.6 用户和密码2.7 登录成功 3. 使用cmd 登录报错提示3.1 手动指定加密算法,提示密码长度无效3.2 …...

SwiftUI 纯手工打造 100% 可定制的导航栏
功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…...

npm install 太慢?解决方法
在使用npm进行包管理时,有时会遇到安装速度缓慢的问题。这可能是由于网络原因或npm官方镜像服务器的繁忙导致的。下面介绍几种常见的解决方法: 使用淘宝镜像 淘宝镜像是一个提供npm包镜像的国内源,其速度较快且稳定。您可以通过以下命令将npm…...

DevOps系列文章之 GitLab CI/CD
CICD是什么? 由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总结一下 介绍gitlab的CICD之前,可以先了解CICD是什么 我们的开发模式…...

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)
需求: 1.我们希望玩家的业务在玩家线程执行,无需回调,因此是多线程处理。 2.匹配线程负责匹配逻辑,是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后,需要给玩家发奖修改玩家数…...