How to configure JMeter JTL result columns

JMeter result files are only useful when the tools that read them know which fields each row contains. The SaveService settings control the CSV columns written to a .jtl file, so dashboards, CI checks, and comparison scripts can read the same result layout on every runner.

SaveService properties can live in jmeter.properties, user.properties, or an extra property file loaded for one run. A small run-specific file keeps the column policy close to the test job without editing the shared JMeter installation, which is easier to review in CI and safer for workstations that run different projects.

A dashboard-compatible CSV needs timing, label, response, success, byte, thread-count, and assertion-failure fields. Keep the field-name header enabled when the file will be parsed outside JMeter; headerless CSV files require the reader to already know the same SaveService property set.

Steps to configure JMeter JTL result columns:

  1. Open a terminal in the directory that contains the saved .jmx test plan.
  2. Create jtl-columns.properties for the result layout.
    jmeter.save.saveservice.output_format=csv
    jmeter.save.saveservice.print_field_names=true
    jmeter.save.saveservice.timestamp_format=ms
    jmeter.save.saveservice.time=true
    jmeter.save.saveservice.label=true
    jmeter.save.saveservice.response_code=true
    jmeter.save.saveservice.response_message=true
    jmeter.save.saveservice.thread_name=true
    jmeter.save.saveservice.data_type=true
    jmeter.save.saveservice.successful=true
    jmeter.save.saveservice.assertion_results_failure_message=true
    jmeter.save.saveservice.bytes=true
    jmeter.save.saveservice.sent_bytes=true
    jmeter.save.saveservice.thread_counts=true
    jmeter.save.saveservice.url=true
    jmeter.save.saveservice.latency=true
    jmeter.save.saveservice.idle_time=true
    jmeter.save.saveservice.connect_time=true

    The property names use successful and thread_counts even though the CSV header prints success, grpThreads, and allThreads.

  3. Run the test plan with the column property file.
    $ jmeter -n -t checkout-smoke.jmx -l checkout-smoke.jtl -q jtl-columns.properties -e -o checkout-dashboard
    Creating summariser <summary>
    Created the tree successfully using checkout-smoke.jmx
    Starting standalone test @ 2026 Jun 30 02:01:01 GMT
    Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
    ##### snipped #####
    summary =      3 in 00:00:00 =    7.1/s Avg:   132 Min:     0 Max:   396 Err:     0 (0.00%)
    Tidying up ...
    ... end of run

    -q loads the extra property file for this run. -e and -o prove that the saved CSV can also feed the JMeter dashboard generator.
    Related: How to override JMeter properties from the command line
    Related: How to generate an HTML dashboard report in JMeter

  4. Check the .jtl header and saved sample rows.
    $ cat checkout-smoke.jtl
    timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
    1782784861315,396,checkout-load,200,OK,Thread Group 1-1,text,true,,27,0,1,1,null,0,0,0
    1782784861713,1,checkout-load,200,OK,Thread Group 1-1,text,true,,27,0,1,1,null,0,0,0
    1782784861714,0,checkout-load,200,OK,Thread Group 1-1,text,true,,27,0,1,1,null,0,0,0

    The first line should contain the exact field names needed by the dashboard, parser, or CI gate. Remove optional fields such as URL only when downstream tools do not depend on them.
    Tool: Comma-Separated Values (CSV) Converter

  5. Confirm that the dashboard generator accepted the configured result file.
    $ ls checkout-dashboard
    content
    index.html
    sbadmin2-1.0.7
    statistics.json