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压测脚本时,实时获取压测详情了。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508450.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析之Tebleau可视化:折线图、饼图、环形图

1.折线图的绘制 方法一: 拖入订单日期和销售金额,自动生成一个折线图 方法二: 选中订单日期和销售金额(摁住ctrl可以选择多个纬度) 点击右边的智能推荐,选择折线图 2.双线图的绘制、双轴的设置 方法一&…

在Python中使用PyPDF2库在PDF文件中插入内容

目录 一、引言 二、PyPDF2库的安装 三、PyPDF2库的基本使用 四、在PDF文件中插入内容 五、注意事项和扩展 六、总结 一、引言 PDF(Portable Document Format)文件因其跨平台、不易被篡改的特性,广泛应用于日常办公和文档交流中。在实际…

MySQL连接查询补充与三表连查

前言 MySQL多表联查是指在一个查询语句中同时查询多个表,并根据表之间的关联条件进行数据的匹配和筛选。通过多表联查,我们可以获取到更丰富的数据信息,从而满足复杂的查询需求。先前了解了三种简单的连接查询方式,这里将进一步介…

17.应用负载压力测试

早些点,下午题考,最近几年出现的少; 备考较为简单;历年真题相似度高; 主要议题: 1.负载压力测试概述 注意这些测试细微的差别; 负载测试和压力测试的方法比较相似,但是目的不同&a…

如何使用potplayer在公网环境访问内网群晖NAS中储存在webdav中的影视资源

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-D7WJh3JaNVrLcj2b {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机:新零售时代的便捷消费革命 在新零售的浪潮中,智能无人售货机作为一个创新的消费模式,已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求,还能通过建立多样化和多层次的消费体…

2024年04月编程语言流行度排名

点击查看最新编程语言流行度排名(每月更新) 2024年04月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多,大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

MotionBuilder 脚本执行

目录 MediaPipe_Pose_in_MotionBuilder 你可以用以下几种方式执行你的脚本: MediaPipe_Pose_in_MotionBuilder https://github.com/Ndgt/MediaPipe_Pose_in_MotionBuilder/blob/main/PoseLandmark.py tcp通信 https://github.com/nils-soderman/motionbuilder-s…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织,由全球领先银行、技术提供商、顾问和学者组成,定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则,银…

RabbitMQ安装及Springboot 集成RabbitMQ实现消息过期发送到死信队列

死信队列 RabbitMQ 的死信队列(Dead-Letter-Exchanges,简称 DLX)是一个强大的特性,它允许在消息在队列中无法被正常消费(例如,消息被拒绝并且没有设置重新入队,或者消息过期)时&…

微服务管理(完整)

前言: 分享一篇学微服务管理的过程 一,etcd入门 1,简介 1.1,etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 官网上的一段描述: A…

Mac 怎么提高音频播放速度?

mac 怎么提高音频播放速度?在Mac上,有时我们可能需要加快音频文件的播放速度,比如加快听力材料的播放速度以提高效率,或者快速浏览录音文件等。幸运的是,Mac系统自带的音频播放器iTunes和QuickTime都提供了简单的方法来…

中科驭数DPU技术开放日秀“肌肉”:云原生网络、RDMA、安全加速、低延时网络等方案组团亮相

2024年3月29日,中科驭数以“DPU构建高性能云算力底座”为主题的线上技术开放日活动成功举办。在开放日上,中科驭数集中展现了其在低时延网络、云原生网络及智算中心网络三大关键场景下的技术成果与五大核心DPU解决方案,凸显了中科驭数在高性能…

HUAWEI 华为交换机 配置 Eth-Trunk 接口流量本地优先转发示例(堆叠)

组网需求 说明 S5720I-10X-PWH-SI-AC 和 S5720I-6X-PWH-SI-AC 不支持此配置。 如 图 3-23 所示,为了增加设备的容量采用设备堆叠技术,将 Switch3 和 Switch4通过专用的堆叠电缆链接起来,对外呈现为一台逻辑交换机。为了实现设备间的备份、…

C# WPF编程-Application类(生命周期、程序集资源、本地化)

C# WPF编程-Application类 应用程序的生命周期创建Application对象应用程序的关闭方式应用程序事件 Application类的任务显示初始界面处理命令行参数访问当前Application对象在窗口之间进行交互 程序集资源添加资源检索资源pack URI内容文件 本地化构建能够本地化的用户界面 每…

vue改名为威优易?

文章目录 vue改名为威优易? 祝大家愚人节快乐哇! 哈哈,大家愚人节快乐!看来我刚刚的“爆料”确实把大家吓了一跳,Vue.js要改名为“威优易”?这纯粹是官方在这个愚人节使者开的一个小小玩笑啦! …

R语言技能 | 不同数据类型的转换

原文链接:R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天,再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢? 我们在使用R语言做数据分析时,会一直对数据进行不同类型的转换,有时候…

VSCode - 离线安装扩展python插件教程

1,下载插件 (1)首先使用浏览器打开 VSCode 插件市场link (2)进入插件主页,点击右侧的 Download Extension 链接,将离线安装包下载下来(文件后缀为 .vsix) 2,…

Windows基线安全检测-安全配置检测

Windows基线安全检测-安全配置检测 前言 Windows在生产环境中是使用最多的一个系统,大部分为客户端,少部分为服务端; 然而其实很多用户对windows系统不是很了解,安全配置更是如此; 因此我们安全人员要定期对员工的主…

心里健康(健康与生存)

你还认为 健康 是有个强壮的身体吗? 这样 肯定是错的 我们来说说 什么是健康与现代健康观 以及影响健康的因素 有哪些? 以及 健康对个人与社会的意义 首先 我们来看看 健康演变过程 公元 1000 年 Health 首次出现 它代表了 强壮 健全 完整等含义 健康 …