JMeter自定义日志与日志分析的实现

 更新时间:2021年12月17日 10:02:38   作者:云深i不知处  
JMeter与Java程序一样,会记录事件日志,本文就介绍一下JMeter自定义日志与日志分析的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1 JMeter日志概览

JMeter与Java程序一样,会记录事件日志,日志文件保存在bin目录中,名称为jmeter.log。当然,我们也可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起。

在这里插入图片描述

可见,通过日志可以帮助我们定位一些不容易直接察觉的问题。

另外,JMeter可以很方便地设置日志输出级别:

在这里插入图片描述

2 JMeter自定义日志

前面所看到的都是系统日志,也就是JMeter本身所打印的日志。如果我们自己想输出一些日志,该怎么办呢?这个一般就要借助Beanshell了。

例如,一个接口响应结果如下:

在这里插入图片描述

在该请求下添加Beanshell断言,运行后,日志中输出了相应内容:

在这里插入图片描述

import org.apache.log4j.Logger;

// 获取接口的响应数据
String result = prev.getResponseDataAsString();

if(result.contains("error")){
	Failure=true;
	log.error("接口失败: " + result);
}

当然,自定义日志最重要的作用还是在Linux服务器上运行脚本时,因为没有界面,排查问题更加麻烦。

承接前文,将JMeter脚本部署到Linux服务器上进行压力测试,存在一些不便之处:

  • 吞吐量统计中包括了所有请求,包括一些辅助请求(beanshell请求),导致真正的tps统计数据不准确。
  • 业务是否成功,以及具体失败原因难以排查。

首先,测试接口的响应内容如图所示:

在这里插入图片描述

在接口下添加2个【JSON Path Extractor】,分别用于在测试接口的响应内容里提取code、orderId。

在这里插入图片描述

在这里插入图片描述

再在测试接口下添加【BeanShell断言】:

import org.apache.log4j.Logger;

// 获取接口的响应数据
String result = prev.getResponseDataAsString();
// 从JSON提取器中获取code和orderId
String code = vars.get("code");
String orderId = vars.get("orderId");

if(code.equals("0")){
	log.info("place order success, orderId=" + orderId);
}else{
	Failure=true;
	log.error("FailureMessage: " + result);
}

将该脚本上传到Linux中,顺便写个启动脚本:start.sh

#!/bin/bash
jmeter_log=/home/test/jmeter.log

if [ -f "$jmeter_log" ]; then
 // 将原日志文件备份后删除
 cp $jmeter_log /home/test/jmeter.log_back
 rm -rf $jmeter_log
fi
// 启动JMeter脚本
jmeter -n -t /home/test/test.jmx -l /home/test/result/test.jtl

运行脚本后,cat jmeter.log,效果如下:

在这里插入图片描述

3 JMeter日志分析

针对该日志写一个日志分析脚本logAnalysis.sh

#!/bin/bash
jmeter_log=/home/test/jmeter.log
thread_num=`grep 'Thread started' $jmeter_log|tail -n 1|awk -F"-" '{print$6}'`
start_time=`grep 'All thread groups have been started' $jmeter_log|awk -F" " '{print $1,$2}'|awk -F"," '{print $1}'`
end_time=`grep 'Shutdown hook ended' $jmeter_log|awk -F" " '{print $1,$2}'|awk -F"," '{print $1}'`

final_success_time=`grep "place order success" $jmeter_log|tail -n 1|awk -F" " '{print$1,$2}'|awk -F"," '{print$1}'`
success_running_time=$[ $(date -d "$final_success_time" +%s) - $(date -d "$start_time" +%s) ]
running_time=$[ $(date -d "$end_time" +%s) - $(date -d "$start_time" +%s) ]
cancle_times=`grep "cancle orders success" $jmeter_log|wc -l`   //撤单次数

success_times=`grep success $jmeter_log|wc -l`   // 成功次数
failure_times=`grep FailureMessage $jmeter_log|wc -l`
request_times=$[ $success_times+$failure_times ]
error_rate=`echo "scale=2; $failure_times/$request_times*100" | bc`
qps=$[ $request_times/$running_time ]
throughput=$[ $success_times/$success_running_time ]

echo -e '线程数:'$thread_num
echo -e '请求次数:' $request_times
echo -e '成功次数:' $success_times
echo -e '失败次数:' $failure_times
echo -e '撤单次数:'$cancle_times
echo -e '错误率:' $error_rate'%'
echo -e '开始时间:'$start_time
echo -e '结束时间:'$end_time
echo -e '最后成功请求时间:'$final_success_time
echo -e '请求时间:' $running_time 
echo -e '成功运行时间:'$success_running_time
echo -e '吞吐量:'$throughput'/s'
echo -e 'QPS:'$qps'/s'

当JMeter脚本运行一段时间后,执行logAnalysis.sh,效果如下:

线程数:180
请求次数: 131691
成功次数: 131493
失败次数: 198
撤单次数:141
错误率: 0%
开始时间:2018-11-28 15:34:54
结束时间:2018-11-28 15:37:17
最后成功请求时间:2018-11-28 15:37:17
请求时间: 143
成功运行时间:143
吞吐量:919/s
QPS:920/s

可以看到,输出信息全面清晰。这样,我们就可以在linux下运行JMeter压测脚本时,实时获取压测详情了。

到此这篇关于JMeter自定义日志与日志分析的实现的文章就介绍到这了,更多相关JMeter自定义日志与日志分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Spring Cloud Eureka 自我保护机制

    浅谈Spring Cloud Eureka 自我保护机制

    这篇文章主要介绍了浅谈Spring Cloud Eureka 自我保护机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 入门java的第一步HelloWorld

    入门java的第一步HelloWorld

    这篇文章主要介绍了入门java的第一步-Hello,World,文中通过示例代码介绍的非常详细,对大家的java初步学习具有一定的学习价值,需要的朋友可以参考下
    2021-04-04
  • java实现支付宝退款功能

    java实现支付宝退款功能

    这篇文章主要为大家详细 介绍了java实现支付宝退款功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 深入了解Java中Synchronized的各种使用方法

    深入了解Java中Synchronized的各种使用方法

    在Java当中synchronized关键字通常是用来标记一个方法或者代码块。本文将通过示例为大家详细介绍一下Synchronized的各种使用方法,需要的可以参考一下
    2022-08-08
  • Java中常见死锁与活锁的实例详解

    Java中常见死锁与活锁的实例详解

    这篇文章主要介绍了Java中常见死锁与活锁的实例详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Spring Boot 连接LDAP的方法

    Spring Boot 连接LDAP的方法

    这篇文章主要介绍了Spring Boot 连接LDAP的方法,仅仅涉及基本的使用ODM来快速实现LDAP增删改查操作。具有一定的参考价值,有兴趣的可以了解一下
    2017-12-12
  • java连接池Druid获取连接getConnection示例详解

    java连接池Druid获取连接getConnection示例详解

    这篇文章主要为大家介绍了java连接池Druid获取连接getConnection示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java @Value(

    Java @Value("${xxx}")取properties时中文乱码的解决

    这篇文章主要介绍了Java @Value("${xxx}")取properties时中文乱码的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 深入了解Spring的事务传播机制

    深入了解Spring的事务传播机制

    Spring事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。本文通过示例详细介绍了Spring的事务传播机制,需要的可以参考一下
    2022-09-09
  • 解决MyBatis Mapper的XML文件SQL语句无法自动提示问题(亲测有效)

    解决MyBatis Mapper的XML文件SQL语句无法自动提示问题(亲测有效)

    这篇文章主要给大家介绍了如何解决MyBatis Mapper的XML文件SQL语句无法自动提示的问题,文中有详细的原因分析,以及通过图文介绍的解决方案,需要的朋友可以参考下
    2023-10-10

最新评论