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

网友投稿 1121 2022-11-14

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

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

目录1 JMeter日志概览2 JMeter自定义日志3 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压测脚本时,实时获取压测详情了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Xilinx ISE、iMPACT、PlanAhead在Windows 10 64位系统下闪退的解决办法
下一篇:【Flutter -- 布局】Container 的基础使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~