温馨提示×

jmeter在centos的日志分析

小樊
37
2025-11-16 04:28:02
栏目: 智能运维

JMeter 在 CentOS 的日志分析与定位指南

一 日志类型与存放位置

  • 运行日志:JMeter 的系统日志为 jmeter.log,默认在 JMETER_HOME/bin/ 下;命令行可通过 -j <日志文件> 指定输出路径,便于分离业务日志与系统日志。分布式压测时,控制机主要查看 bin/jmeter.log,负载机查看 bin/jmeter-server.log。实时查看可用命令:tail -f jmeter.log
  • 结果日志:压测结果建议输出为 JTL/CSV(如 -l result.jtl),用于后续统计、绘图与报表生成;也可结合 -e -o <报告目录> 生成 HTML 报告。
  • 分布式与 Server 模式:负载机启动 jmeter-server 后,日志为 jmeter-server.log,通常与 jmeter.log 同目录(即 bin/)。

二 常用命令与日志输出控制

  • 非 GUI 执行并分离日志与结果:
    • 示例:jmeter -n -t test.jmx -l result.jtl -j jmeter.log
    • 说明:-n 非 GUI、-t 指定脚本、-l 结果文件、-j 运行日志。
  • 生成 HTML 报告(基于 JTL):
    • 示例:jmeter -g result.jtl -e -o report/(或直接在压测命令后追加 -e -o report/)。
  • 实时查看与过滤:
    • 实时看日志:tail -f jmeter.log
    • 过滤错误:grep -i error jmeter.log
    • 按时间窗口查看:sed -n ‘/2025-11-16 10:00:00/,/2025-11-16 10:10:00/p’ jmeter.log
  • 日志级别控制:
    • 临时调整:在 JMeter GUI 右上角点击日志图标设置级别(重启后失效)。
    • 永久调整:编辑 JMETER_HOME/bin/log4j2.xml,修改 Root level(如 DEBUG/INFO/WARN/ERROR),对 GUI 与命令行均生效。

三 关键日志关键字与定位思路

  • 关键阶段关键字(用于估算测试时长、线程数与阶段状态):
    • 线程启动:Thread started
    • 全部线程组已启动:All thread groups have been started
    • 结束钩子:Shutdown hook ended
  • 业务自定义关键字(建议在脚本中用 log.info / log.error 打印,便于在服务器环境排查):
    • 成功样例:log.info(“place order success, orderId=” + orderId);
    • 失败样例:log.error("FailureMessage: " + result);
  • 分布式角色识别:
    • 控制机:关注 jmeter.log
    • 负载机:关注 jmeter-server.log
  • 排查路径建议:
    • 先看 jmeter.log 的 ERROR/WARN,定位初始化、插件、DNS、连接池、脚本语法等问题;
    • 再用业务关键字筛选,还原失败请求上下文(参数、响应片段、关联变量等);
    • 对照 JTL/CSV 的错误率与响应时间分布,交叉验证问题复现与影响范围。

四 快速指标计算与 Shell 脚本示例

  • 基于 jmeter.log 的简易统计脚本(示例,按实际关键字调整):
    • 计算思路:从日志抽取开始/结束时间、成功/失败次数,进而得到错误率、QPS、吞吐量等。
    • 示例脚本(保存为 logAnalysis.sh,执行:bash logAnalysis.sh jmeter.log):
      #!/usr/bin/env bash
      set -euo pipefail
      LOG="${1:-jmeter.log}"
      
      thread_num=$(grep 'Thread started' "$LOG" | tail -n1 | awk -F'-' '{print $6}')
      start_time=$(grep 'All thread groups have been started' "$LOG" | head -n1 | awk '{print $1,$2}' | sed 's/,//g')
      end_time=$(grep 'Shutdown hook ended' "$LOG" | tail -n1 | awk '{print $1,$2}' | sed 's/,//g')
      final_success_time=$(grep 'place order success' "$LOG" | tail -n1 | awk '{print $1,$2}' | sed 's/,//g')
      
      to_sec() { date -d "$1" +%s 2>/dev/null || echo 0; }
      
      start_sec=$(to_sec "$start_time")
      end_sec=$(to_sec "$end_time")
      final_sec=$(to_sec "$final_success_time")
      
      success_times=$(grep -c 'place order success' "$LOG" || true)
      failure_times=$(grep -c 'FailureMessage' "$LOG" || true)
      request_times=$((success_times + failure_times))
      
      error_rate=$(awk -v s="$failure_times" -v r="$request_times" 'BEGIN{printf "%.2f", r>0?s/r*100:0}')
      running_time=$((end_sec - start_sec))
      success_running_time=$((final_sec - start_sec))
      
      qps=$(awk -v r="$request_times" -v t="$running_time" 'BEGIN{printf "%.2f", t>0?r/t:0}')
      throughput=$(awk -v s="$success_times" -v t="$success_running_time" 'BEGIN{printf "%.2f", t>0?s/t:0}')
      
      echo "线程数: $thread_num"
      echo "请求次数: $request_times"
      echo "成功次数: $success_times"
      echo "失败次数: $failure_times"
      echo "错误率: ${error_rate}%"
      echo "开始时间: $start_time"
      echo "结束时间: $end_time"
      echo "最后成功时间: $final_success_time"
      echo "测试时长(秒): $running_time"
      echo "成功运行时长(秒): $success_running_time"
      echo "吞吐量(成功/秒): ${throughput}/s"
      echo "QPS(请求/秒): ${qps}/s"
      
    • 提示:若需统计其他业务动作(如撤单),在脚本中新增对应 grep 计数项即可。

五 结果日志 JTL/CSV 的分析与可视化

  • 字段说明(常见 CSV 头):timeStamp, elapsed, label, responseCode, responseMessage, bytes, latency, success。可用 pandas 快速统计与绘图:
    • 示例(安装:pip install pandas matplotlib):
      import pandas as pd
      import matplotlib.pyplot as plt
      
      cols = ['timeStamp','elapsed','label','responseCode','responseMessage','bytes','latency','success']
      df = pd.read_csv('result.jtl', names=cols, skiprows=1)
      
      total = len(df)
      success = int(df['success'].sum())
      rate = success / total * 100
      avg_rt = df['elapsed'].mean()
      
      print(f"总请求数: {total}")
      print(f"成功率: {rate:.2f}%")
      print(f"平均响应时间: {avg_rt:.2f} ms")
      
      plt.hist(df['elapsed'], bins=50, color='skyblue', edgecolor='black')
      plt.title('响应时间分布')
      plt.xlabel('响应时间(ms)')
      plt.ylabel('请求数')
      plt.grid(True)
      plt.tight_layout()
      plt.show()
      
  • 也可使用 JMeter 自带报表:jmeter -g result.jtl -e -o report/,在浏览器查看 report/index.html 中的图表(响应时间分布、百分位、吞吐量等)。

0