JMeter-如何记录失败响应的完整请求?

JMeter-如何记录失败响应的完整请求?,jmeter,Jmeter,我正在使用JMeter命令行对我们的网站api进行压力测试。现在,我得到了一个示例结果: Creating summariser <summary> Created the tree successfully using street_advisor.jmx Starting the test @ Sat Oct 03 15:22:59 PDT 2009 (1254608579848) Waiting for possible shutdown message on port 444

我正在使用JMeter命令行对我们的网站api进行压力测试。现在,我得到了一个示例结果:

Creating summariser <summary>
Created the tree successfully using street_advisor.jmx
Starting the test @ Sat Oct 03 15:22:59 PDT 2009 (1254608579848)
Waiting for possible shutdown message on port 4445
summary +     1 in   0.0s =   37.0/s Avg:    27 Min:    27 Max:    27 Err:     1 (100.00%)
<snip a few more lines>
<then i break it>
现在,在有人说“检查Web服务器日志文件”之前,我知道我可以这样做,是的,我找到了404。。但我想看看是否有可能不访问它们。。尤其是当他们在另一台服务器上和/或我无法访问他们时。 请帮忙

组件显示所有样本响应的树,允许您查看任何样本的请求和响应

进行负载测试时(始终处于非GUI模式),请填写“文件名”字段并选择仅保存错误响应:

正如您在上面看到的,我们单击Configure以选择除CSV字段以外的所有字段

您还可以使用以下命令将整个响应保存到文件:


我发现此线程正在搜索一个解决方案,以便仅在采样器失败时记录响应,因此接受的解决方案对我不好。我偶尔会在非常高的负载下出现样本故障,涉及数十万个样本,因此树侦听器对我来说是完全不现实的(它的大小将达到几GB),因此下面是我的想法(这对OP的场景也有好处):

添加一个
[JSR223断言][1]
(应该在所有其他断言之后)并将以下代码放入其中:

if (Boolean.valueOf(vars.get("DEBUG"))) {
  for (a: SampleResult.getAssertionResults()) {
    if (a.isError() || a.isFailure()) {
      log.error(Thread.currentThread().getName()+": "+SampleLabel+": Assertion failed for response: " + new String((byte[]) ResponseData));
    }
  }
}

这将导致整个响应被记录到jmeter日志文件中,这在我的情况下很好,因为我知道响应非常小,但对于大响应,可以进行更智能的处理。

有一个“将响应保存到文件”侦听器,只有出现错误时才能保存到文件。

这是我记录失败请求的完整请求(请求URL+请求正文)的方式

  • 在线程组中添加侦听器

  • 对于线程组中的每个采样器,侦听器将在采样器之后执行此代码

    没错,但我是通过命令行来完成的。。所以我没有访问GUI的权限。Bu tI在我的问题(脸红)中没有具体说明这一点。另外,我也不知道如何通过命令行来完成,所以我最终还是按照你的建议去做了:)如果你使用命令行,你可以将测试配置为将数据发送到输出文件(jtl),然后用这个工具处理该文件:导出为PNG或CSV。如果我正确阅读了问题,正在查找记录的请求而不是响应…?@arceldon捕捉得很好!完整的请求和响应被重新编码。@rodrigoap-稍微调整了您的答案,
    请求和响应都
    。我添加了使用名为“DEBUG”的UDV控制日志的功能,因此更容易将断言保留在常规工作负载中,并仅在必要时启用它。@haridsv做得不错!但是有可能保存导致响应失败的requestData吗?@ShurupuS根据
    BeanShell Assertion
    上的组件引用,
    RequestHeaders
    作为BeanShell代码的变量可用,因此理论上是可能的。@haridsv您能帮我解决这个问题吗?在上面的解决方案中,“调试”变量是什么。我们需要定义“调试”变量的位置和原因您将此代码添加到哪种侦听器?我使用了JSR223侦听器。更多信息请点击此处:
    if (Boolean.valueOf(vars.get("DEBUG"))) {
      for (a: SampleResult.getAssertionResults()) {
        if (a.isError() || a.isFailure()) {
          log.error(Thread.currentThread().getName()+": "+SampleLabel+": Assertion failed for response: " + new String((byte[]) ResponseData));
        }
      }
    }
    
    try{
      var message = "";
      var currentUrl = sampler.getUrl();
      message +=  ". URL = " +currentUrl;
      var requestBody = sampler.getArguments().getArgument(0).getValue();
      message += " --data " + sampler.getArguments();
    
      if(!sampleResult.isSuccessful()){
          log.error(message);
      }
    
    }catch(err){
      //do nothing. this could be a debug sampler. no need to log the error
    }