遇到bug如何查日志

当测试遇到bug,你是会第一时间提给开发,还是先自己分析一下再提?

如果当你提每次提bug,能顺带把bug原因附带上,我相信开发对你的印象会非常好~

那么今天就说一说,我们如何去分析定位bug。

分析bug绕不开查日志,这篇以查日志这一环节细说一下~

大家都知道要查日志,那对于新手来说,怎么着手查日志呢?

01 在查之前,我们必然会面临如下问题:

  • 查什么?
  • 去哪查?
  • 怎么查?

02 举个具体的例子

场景:注册一个账号后,去实名认证,认证页面显示认证成功了,返回到主页还是未认证;不是前端显示问题;(业务逻辑:账号是一个系统,认证是另一个系统,分别由两个团队负责)

现在要开始定位问题了:

1、查什么?

前提:必须要了解实现逻辑:认证成功后会给账号发送mq,账号消费mq成功,更新账号的认证状态;

首先需确认是账号的问题?还是认证的问题?怎么确认呢?

  • 查认证发mq了吗?
  • 如果发了,账号消费mq了吗?
  • 如果mq已消费,查有报错吗?
  • 没有报错,查有更新认证状态的日志吗?
2、去哪查?

不同的问题在不同的地方查;我们可以

  • 去服务器下查日志log文件;
  • 有日志系统的直接去系统查;(比如kibana,很多公司用)
  • 去MQ后台查;

如果实在不知道去哪查,后端有一个必杀技,那就是查服务器日志;

但你需要清楚,服务端日志在哪?有没有权限?

很多公司对服务器的访问都会设置很多权限,诸如跳板机、堡垒机等等(可以去网上搜下是什么);

如果是跳板机,就去找运维申请账号权限,一般情况下运维会有指引手册,教如何登录到服务器下;

登录到了服务器下,就去问开发,哪个服务的日志在哪个路径下;

3、怎么查

找到了位置,就到了最重要的环节,怎么查;

1)查认证发mq了吗?

两种方法:

方法一:

直接查日志,搜索发送mq的关键词(开发写了打log才能查,要是没写就没办法)

如果在日志能搜到,就可以说明发了

(下图是随便找的截图,kibana搜索举例;如果是在服务器下搜索,就用grep搜索,这就涉及到Linux命令,此处不细说)

方法二:

登录mq后台,查是否发了

由于已消费的mq查不到记录,所以在mq后台查的话,需要自己新建一个队列去绑定发送的交换机,来监听发送方是否发了(这个我下篇讲吧,这里就不细讲了)

贴个图

2)如果认证发了mq,账号消费mq了吗?

这个和上面一样,查消费日志、或者去mq后台查有没有积压;

3)如果mq已消费,查有报错吗?

一般这种异步处理的场景,报错不会体现在接口本身,而只是内部报错;

以账号userid为关键字搜索,或者最后一次请求的requestid为关键字搜索,根据操作时间看对应的服务器日志有没有报错信息;

如果有报错,一般长这样; 具体在哪一行都暴露出来;

(查服务器日志更简单,直接查error文件就行)

4)没有报错,查有更新认证状态的日志吗?

这个就跟上面一样了,只不过查询的关键字不同。

以上就讲完了日志的分析查看过程。

分析问题前,一定要熟悉业务逻辑,不能盲目提bug,如果不去定位,稍微复杂的场景就会提错开发负责人,尤其涉及团队协作的,如果能更精准定位到责任方,就能更快速去解决问题。

当然有个更重要的点,就是能提升自己的能力,这样才能一步步升级打怪!

### avue-crud 分页Bug 的解决方案 在使用 `avue-crud` 进行分页询时,可能会遇到一些常见的问题,比如数据未正确更新、页面刷新后丢失状态等。以下是针对这些问题的具体分析和解决方法: #### 1. 数据源同步问题 如果修改了代码但发现逻辑并未生效,可能是因为缓存导致的问题[^2]。可以通过清理服务器缓存和服务端项目缓存来解决问题: ```bash # 清理 Tomcat 缓存 Servers -> 右键 -> Clean # 清理 Eclipse 或 IDE 中的 Project 缓存 Project -> Clean... ``` 此外,确认代码是否已提交并部署到目标环境。如果没有正确提交或分支错误,则可能导致新代码未被加载。 --- #### 2. 接口返回数据绑定问题 当分页询完成后,需确保接口返回的数据能够正确绑定至组件的状态变量中。通常情况下,`avue-crud` 使用的是 Vue.js 的响应式机制,因此需要遵循以下步骤: - **异步请求完成后再操作 DOM** 如果直接赋值数据而未等待 DOM 更新完毕,可能会引发布局混乱等问题。可以借助 `$nextTick` 方法,在下次 DOM 更新循环结束后执行回调函数[^3]。 ```javascript async fetchData(page, size) { const res = await getApi({ page, size }); // 调用分页接口 this.pageTotal = res.data.total; // 设置总记录数 this.tableData = res.data.rows; // 绑定当前页数据 this.$nextTick(() => { // 确保 DOM 已更新 this.$refs.crud.doLayout(); // 手动触发表格重绘 }); } ``` --- #### 3. 类型转换与空值校验 在处理后台传来的数据时,需要注意字段类型的匹配以及潜在的空值情况。例如,某些字段可能是字符串形式的数字,此时应显式进行类型转换,并增加必要的校验逻辑: ```javascript if (res.data && Array.isArray(res.data.rows)) { this.tableData = res.data.rows.map(item => ({ ...item, age: item.age ? parseInt(item.age, 10) : null, // 将年龄转为整数 })); } ``` 对于可能出现的异常(如 `NumberFormatException`),应在前端做好预处理,避免因非法输入而导致程序崩溃。 --- #### 4. JVM 实时监控与性能优化 为了更好地排线上问题,建议引入 JVM 监控工具以观察系统运行状态。常用的工具有 JConsole 和 VisualVM,它们可以帮助开发者了解内存占用、线程活动等情况[^1]。另外,生成火焰图也是快速定位热点的有效手段之一。具体命令如下: ```bash # 安装 perf 工具 sudo apt-get install linux-tools-common linux-tools-generic linux-cloud-tools-generic # 获取 Java 应用 PID 并采集样本 perf record -F 99 -a -g -- sleep 30 perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flamegraph.svg ``` 上述过程会生成一张 SVG 图像文件,直观展示 CPU 时间消耗分布。 --- #### 5. 日志增强策略 由于生产环境中无法直接调试代码,可通过加强日志记录的方式辅助诊断问题。推荐采用结构化日志框架(如 Logback 或 SLF4J),并将关键业务流程打印出来以便后续追踪。 ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExampleService { private static final Logger logger = LoggerFactory.getLogger(ExampleService.class); public void processUserRequest(String userId) { try { logger.info("Processing request for user {}", userId); // 主要业务逻辑 logger.debug("Completed processing successfully."); } catch (Exception e) { logger.error("Error occurred while handling user {}'s data", userId, e); } } } ``` --- #### 6. 表格闪烁或布局错乱 若存在表格渲染过程中频繁闪烁的现象,通常是由于数据动态变化引起视图重建所致。除了利用 `$nextTick` 外,还可以尝试设置固定高度或其他样式属性稳定界面表现。 ```css /* CSS */ .avue-crud__wrapper { overflow-y: auto !important; } /* JavaScript */ this.$refs.crud.setHeight(window.innerHeight * 0.8); // 动态调整表格高度 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值