JMeter自定義日志與日志分析的實現(xiàn)
1 JMeter日志概覽
JMeter與Java程序一樣,會記錄事件日志,日志文件保存在bin目錄中,名稱為jmeter.log
。當(dāng)然,我們也可以在面板中直接察看日志,點擊右上角黃色標(biāo)志物可以打開日志面板,再次點擊收起。
可見,通過日志可以幫助我們定位一些不容易直接察覺的問題。
另外,JMeter可以很方便地設(shè)置日志輸出級別:
2 JMeter自定義日志
前面所看到的都是系統(tǒng)日志,也就是JMeter本身所打印的日志。如果我們自己想輸出一些日志,該怎么辦呢?這個一般就要借助Beanshell了。
例如,一個接口響應(yīng)結(jié)果如下:
在該請求下添加Beanshell斷言,運行后,日志中輸出了相應(yīng)內(nèi)容:
import org.apache.log4j.Logger; // 獲取接口的響應(yīng)數(shù)據(jù) String result = prev.getResponseDataAsString(); if(result.contains("error")){ Failure=true; log.error("接口失敗: " + result); }
當(dāng)然,自定義日志最重要的作用還是在Linux服務(wù)器上運行腳本時,因為沒有界面,排查問題更加麻煩。
承接前文,將JMeter腳本部署到Linux服務(wù)器上進行壓力測試,存在一些不便之處:
- 吞吐量統(tǒng)計中包括了所有請求,包括一些輔助請求(beanshell請求),導(dǎo)致真正的tps統(tǒng)計數(shù)據(jù)不準(zhǔn)確。
- 業(yè)務(wù)是否成功,以及具體失敗原因難以排查。
首先,測試接口的響應(yīng)內(nèi)容如圖所示:
在接口下添加2個【JSON Path Extractor】,分別用于在測試接口的響應(yīng)內(nèi)容里提取code、orderId。
再在測試接口下添加【BeanShell斷言】:
import org.apache.log4j.Logger; // 獲取接口的響應(yīng)數(shù)據(jù) 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` //撤單次數(shù) success_times=`grep success $jmeter_log|wc -l` // 成功次數(shù) 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 '線程數(shù):'$thread_num echo -e '請求次數(shù):' $request_times echo -e '成功次數(shù):' $success_times echo -e '失敗次數(shù):' $failure_times echo -e '撤單次數(shù):'$cancle_times echo -e '錯誤率:' $error_rate'%' echo -e '開始時間:'$start_time echo -e '結(jié)束時間:'$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'
當(dāng)JMeter腳本運行一段時間后,執(zhí)行l(wèi)ogAnalysis.sh,效果如下:
線程數(shù):180
請求次數(shù): 131691
成功次數(shù): 131493
失敗次數(shù): 198
撤單次數(shù):141
錯誤率: 0%
開始時間:2018-11-28 15:34:54
結(jié)束時間:2018-11-28 15:37:17
最后成功請求時間:2018-11-28 15:37:17
請求時間: 143
成功運行時間:143
吞吐量:919/s
QPS:920/s
可以看到,輸出信息全面清晰。這樣,我們就可以在linux下運行JMeter壓測腳本時,實時獲取壓測詳情了。
到此這篇關(guān)于JMeter自定義日志與日志分析的實現(xiàn)的文章就介紹到這了,更多相關(guān)JMeter自定義日志與日志分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java連接池Druid獲取連接getConnection示例詳解
這篇文章主要為大家介紹了java連接池Druid獲取連接getConnection示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Java @Value("${xxx}")取properties時中文亂碼的解決
這篇文章主要介紹了Java @Value("${xxx}")取properties時中文亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07解決MyBatis Mapper的XML文件SQL語句無法自動提示問題(親測有效)
這篇文章主要給大家介紹了如何解決MyBatis Mapper的XML文件SQL語句無法自動提示的問題,文中有詳細(xì)的原因分析,以及通過圖文介紹的解決方案,需要的朋友可以參考下2023-10-10