Enhancing Your Locust Tests with Custom Logging

Why Use Logging in Locust?

While Locust's web UI and metrics provide an overview of test performance, logging allows you to:

  • Track Key Events: Record specific milestones or observations during a test.

  • Debug Failures: Investigate why certain requests fail.

  • Maintain Historical Records: Keep a log of test runs for later analysis.

  • Monitor Tests in Real Time: Watch logs to understand system behavior as the test runs.

Setting Up Logging in Locust

The logging module is built into Python, making it easy to configure and use in Locust scripts. Here’s how to set up a logger:

  1. Initialize a Logger: Use logging.getLogger("locust") to create or retrieve a logger.

  2. Set the Log Level: Control the verbosity of your logs with levels like DEBUG, INFO, WARNING, ERROR, or CRITICAL.

  3. Add Log Messages: Use methods like logger.info(), logger.warning(), and logger.error() to log events during your test.

Example: Logging in a Locust Test

Here’s an example of a Locust test that uses logging to track a specific scenario: validating a response from a /todos endpoint.

from locust import HttpUser, constant, task
import logging

# Initialize a logger
logger = logging.getLogger("locust")
logger.setLevel(logging.INFO)  # Set log level to INFO

class MyReqRes(HttpUser):
    wait_time = constant(1)  # Wait 1 second between tasks
    host = "http://localhost:8001"  # Set the target host

    @task
    def get_todos(self):
        # Send a GET request to the "/todos/104" endpoint
        with self.client.get("/todos/104", name="test todo", catch_response=True) as resp1:
            if resp1.status_code == 200 and "Christian Adams" in resp1.json().get("name", ""):
                # Log a success message if the condition is met
                logger.info("Successfully found user 'Christian Adams'.")
                resp1.success()
            else:
                # Log a warning message if the condition is not met
                logger.warning(f"Failed to validate user. Response: {resp1.text}")
                resp1.failure("User validation failed.")

Breakdown of the Code

  1. Logger Initialization:

    • A logger named "locust" is created using logging.getLogger("locust").

    • The log level is set to INFO to filter out unnecessary details while still capturing significant events.

  2. Adding Log Messages:

    • When the response contains "Christian Adams", an informational log is recorded.

    • If validation fails, a warning message is logged, including the response text for debugging.

  3. Catch Response Validation:

    • The catch_response=True parameter enables manual validation of responses, making it easier to integrate logging into the decision-making process.

Running the Test

To run this script, execute

locust -f logger_locust.py --headless -u 10 -r 1

This command simulates 10 users, spawning at a rate of 1 user per second. Logs will appear in the console as the test runs.

Last updated