Skip to main content

Setting up Logstash Development Environment: A Complete Guide

Introduction

Setting up a Logstash development environment can be complex, especially when working with custom plugins and multiple versions. This guide walks you through the complete process of setting up Logstash from source, building custom filter and input plugins, and installing them for use.

Version Compatibility

Before starting, it's crucial to understand the version dependencies:

  • GDP 11.x → Logstash 7.x → Java 8
  • GDP 12.x → Logstash 8.x → Java 11

Make sure you're using the correct Java version for your target Logstash version.

Prerequisites

1. Java SDK Installation

Download and install the IBM Semeru Runtime from:

https://developer.ibm.com/languages/java/semeru-runtimes/downloads/?license=IBM

2. Clone Required Repositories

You'll need to clone three repositories:

Logstash Core:

git clone https://github.com/elastic/logstash.git

For a specific older version:

git clone --branch 7.5 --single-branch https://github.com/elastic/logstash.git

Universal Connectors (Public):

git clone https://github.com/IBM/universal-connectors

Universal Connectors (Internal): Note: Only for IBM's developers

git clone https://github.ibm.com/Activity-Insights/universal-connectors

3. Build Common Project

Navigate to the common project inside the public universal-connectors repo and build it:

  1. Clean the project
  2. Run assemble
  3. Run build

Building Logstash from Source

Step 1: Install Ruby Version Manager (RVM)

Follow the official Logstash development guide, then execute these commands:

# Install specific JRuby version
rvm install "jruby-9.3.10.0"

# Install required gems
gem install rake
gem install bundler -v 2.3.27

# Import GPG keys
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

# Install RVM with stable Ruby
\curl -sSL https://get.rvm.io | bash -s stable --ruby=$(cat .ruby-version)

Step 2: Verify Ruby Version

Ensure your Ruby version matches the required version:

ruby -v
cat .ruby-version

These two commands should output the same version.

Step 3: Set Environment Variables

Set these critical environment variables:

export OSS=false
export LOGSTASH_SOURCE=1
export LOGSTASH_PATH=pathToLogstashDirectory/logstash

Important Note: The OSS=false export is crucial. Without it, you may encounter this error when testing:

Logstash stopped processing because of an error: (SystemExit) exit

Step 4: Test Your Logstash Installation

Run a simple test to verify Logstash is working:

bin/logstash -e 'input { stdin { } } output { stdout {} }'

Building a Filter Plugin

Step 1: Create gradle.properties

In your filter plugin project root, create a gradle.properties file with these paths (adjust to your local setup):

LOGSTASH_CORE_PATH=pathToLogstashDirectory/logstash/logstash-core
GUARDIUM_UNIVERSALCONNECTOR_COMMONS_PATH=pathToPublicUniversalConnectorDirectory/guardium-universalconnector-commons/build/libs

Step 2: Modify build.gradle

Add to the build script section:

ext {
snakeYamlVersion = '2.2'
}

Change the implementation line from:

implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "build/libs/logstash-core-*.*.*.jar")

To:

implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "build/libs/logstash-core.jar")

Note: You may need to re-import the Record type after these changes.

Step 3: Build the Plugin

chmod +x gradlew
./gradlew clean build gem

Run tests to verify everything works correctly.

Building an Input Plugin

The process for input plugins is similar to filter plugins with slight variations:

Step 1: Configure gradle.properties

LOGSTASH_CORE_PATH=pathToLogstashDirectory/logstash/logstash-core

If there are conflicting paths, comment them out:

#LOGSTASH_CORE_PATH=pathToLogstashDirectory/universal-connector-master/logstash-master/logstash-core

Step 2: Modify build.gradle

Add the same build script modifications as the filter plugin:

ext {
snakeYamlVersion = '2.2'
}

Update the implementation line:

implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "build/libs/logstash-core.jar")

Step 3: Build

./gradlew clean build

Installing a Filter Plugin

Step 1: Prepare Offline Pack

From your plugin project directory:

bin/logstash-plugin prepare-offline-pack \
--output logstash-filter-auroramysqlguardiumpluginfilter.zip \
--overwrite logstash-filter-auroramysqlguardiumpluginfilter

Step 2: Install the Plugin

Navigate to your Logstash project directory and install:

bin/logstash-plugin install \
--no-verify \
--local logstash-filter-auroramysqlguardiumpluginfilter-1.0.1.gem

Common Issues and Solutions

Issue 1: SystemExit Error

Problem: Logstash stopped processing because of an error: (SystemExit) exit

Solution: Ensure you've set export OSS=false before running Logstash.

Issue 2: Ruby Version Mismatch

Problem: Ruby version doesn't match requirements

Solution: Use RVM to install the exact version specified in .ruby-version:

rvm install "jruby-9.3.10.0"
rvm use jruby-9.3.10.0

Issue 3: Build Failures

Problem: Gradle build fails with dependency issues

Solution:

  • Verify all paths in gradle.properties are correct
  • Ensure the common project is built first
  • Check that snakeYamlVersion is set to 2.2

Best Practices

  1. Version Control: Keep track of which Logstash version you're building against
  2. Path Management: Use absolute paths in gradle.properties to avoid confusion
  3. Test Incrementally: Test after each major step rather than waiting until the end
  4. Documentation: Keep notes on any custom modifications you make

Conclusion

Setting up a Logstash development environment requires careful attention to version compatibility, proper configuration of build files, and correct environment variables. By following this guide, you should be able to:

  • Build Logstash from source
  • Create custom filter and input plugins
  • Install and test your plugins locally

This setup enables you to develop, test, and deploy custom Logstash plugins for your specific data processing needs.

Additional Resources


Last Updated: January 2026