JMeter自定义日志与日志分析的实现
JMeter与Java程序一样,会记录事件日志,本文就介绍一下JMeter自定义日志与日志分析的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
目录
1 JMeter日志概览
2 JMeter自定义日志
3 JMeter日志分析
1 JMeter日志概览
JMeter与Java程序一样,会记录事件日志,日志文件保存在bin目录中,名称为jmeter.log
。当然,我们也可以在面板中直接察看日志,点击右上角黄色标志物可以打开日志面板,再次点击收起。
可见,通过日志可以帮助我们定位一些不容易直接察觉的问题。
另外,JMeter可以很方便地设置日志输出级别:
2 JMeter自定义日志
前面所看到的都是系统日志,也就是JMeter本身所打印的日志。如果我们自己想输出一些日志,该怎么办呢?这个一般就要借助Beanshell了。
例如,一个接口响应结果如下:
在该请求下添加Beanshell断言,运行后,日志中输出了相应内容:
1 2 3 4 5 6 7 8 9 | 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断言】:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 2 3 4 5 6 7 8 9 10 | #!/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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/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自定义日志与日志分析的实现的文章就介绍到这了
原文链接:https://blog.csdn.net/mu_wind/article/details/95752633