作者 : Stanley 罗昊
注: 作者使用 IDEA + Gradle
注: 需要有一定的 java SpringBoot and SSM+Springcloud 基础
程序测试错误追责
我举个例子, 我现在要做一个电商项目, 项目里面有一个购买模块, 那我这边可能要执行一个代码, 比如减库存之类的东西, 那我两个服务不就是要相互调用嘛, 我自身是一个服务, 我现在要调用减库存这个服务;
你调用它, 你知道它一定能执行成功吗? 肯定是不一定;
比如说, 我现在要执行一个减库存的代码, 我调用这个方法会进行库存的一个更改, 这个库存减少成功还好, 万一要是失败就会出现一个问题就是, 做前端的来调用你, 但是你出错了, 这时你也不知道你这个减库存到底有没有执行成功, 两个人就会相互排斥问题, 不知道到底是你前端调用的问题, 还是我后端代码写的有毛病, 反正测试工程师就只知道库存没有减;
解决方案就是, 记日志;
记录日志
首先, springboot 里面有集成好的日志组件, 我们仅需拿来用即可, 接下来, 我将会分几个步骤来教大家如何在记日志;
1. 首先我们打开一个编写好的子项目 (服务), 在 YAML 配置文件中进行一些简单的配置:
logging:
path: 日志打印输出路径
level:
该服务的全包名: #级别 [info 级别最好, 我用的是 debug 级别]
2. 在我们的 Controllerc 引入 Logge 接口:
public static Logger logger = LoggerFactory.getLogger(# 当前类);
注意: 引入 Logger 时, 它有许多个记日志的版本, java 统一了成了 slf4j, 所以导入包的时候一定注意不要导错!
2. 导入成功并且后需要把当前类加入到日志中:
3. 开始调用日志
在控制层接口中调用日志
logger.debug("执行了查询, 开始调用 project-solr 的服务");
这里的话就简单的记录一下日志, 将来方便追错;
4. 运行程序, 查看是日志是否能被记录
首先运行注册中心, 再启动自己写好的服务朝注册中心注册一下
查看注册中心:
发现 Solr 注册进来了, 注册中心我这边用的是集群负载均衡, 三个注册中心相互注册, 在后面可以清楚的看到我另外三个注册中心的端口号
5. 调用 Solr 服务, 查看日志是否输出并打印:
点击去查看一下:
总中我我们可以清楚的看到, 从开始, 到结束, 就是中间打印了一些其他的东西, 这个先不去深究它;
小结
在工作中, 别人的代码到底能不能执行成功, 你是保证不了的, 唯有记日志, 来证明自己的代码没有问题, 从上我选择在调用前打印日志, 在调用后也打印了日志, 说明我这个接口没有问题, 但是, 你调用你的 Solr 服务, 出现了问题, 那是你的问题, 跟我调用无关, 我正常调用没问题, 至于后面库存没有减少, 那, 就是你的问题;
给 Solr 添加日志记录
刚才我是以调用对方服务的方式来记录日志, 保证自己正常调用, 那么, 我们 Solr 也应该记录一下日志, 因为, 它也保证不了调用 Solr 的人, 是否存在调用问题, 所以, 我要保证我 Solr 正常执行, 为了证明我是没有问题的, 所以我们也给 Solr 这个服务记录日志;
很简单, 跟上面的一样, 我直接复制粘贴即可, 但是这次稍微的改一下;
- logging:
- path: C:\Users\30901\Desktop\log\project_solr
- level:
- com.lh.project.Solr: info
注意: 级别前面的包名需要更改成当前服务的包名, 这次我在日志输出路径中多加了一个当前服务名, 这样打印出的日志就能分别出谁打印出来的;
注意, 日志文件是自动生成出来的;
我们把项目跑起来, 试试, 看看日志能不能被成功输出:
我们也可以清楚的看见, 日志信息在这里打印的非常清楚;
这个是它自动生成的日志文件:
分布式链路追踪
首先需要引入依赖:
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
根据以上的例子, 两个服务均需要用到用到分布式链路跟踪, 所以我们两个两个都配置一下;
加完所需依赖后, 我们再进行日志的输出, 看看有什么区别:
区别就能发现, 前面多出来了一串乱码, 跟上面对比, 就能看出来, 那么具体是什么意思呢?
首先打印出来的日志有两个, 一个是调用方, 一个是被调用方, 我们打开这两个日志来看一下:
这个时候, 假设, 以上一个请求, 其中一个有问题, 那么, 你就可以把这个有问题的这个乱码跟被调用方里面的日志进行匹配, 如果查询到了, 那么说明这两个日志, 对应的是同一个请求, 咱们就可以通过这个乱码就可以判断, 这两个服务调用的到底是不是属于同一个请求;
这个乱码分成三段:
第一高段请求方与调用方式一样的, 因为它们属于同一个链路上, 所以一样, 因此, 我们可以通过第一段代码, 来跟踪;
来源: https://www.cnblogs.com/StanleyBlogs/p/10577278.html