pentaho/pentaho-kettle · error · KettleException

SyslogMessage.Error.MessageFieldMissing

Error message

SyslogMessage.Error.MessageFieldMissing

What it means

First-row validation in SyslogMessage.processRow: the step's Message field setting is empty, so there is no stream field to take the syslog message text from. Fires once, on the first row, before any message is sent.

Solutions

  1. Set 'Message fieldname' in the Syslog Message step dialog to an existing incoming field
  2. Re-save the transformation so the fieldname attribute is persisted
  3. Add a check() pass or validation before running to catch the blank setting early
  4. If the field comes from an upstream step, verify that step emits it

Example fix

// before
meta.setMessageFieldName("");
// after
meta.setMessageFieldName("message");
Defensive patterns

Strategy: validation

Validate before calling

if (meta.getMessageFieldName() == null || meta.getMessageFieldName().trim().isEmpty()) { throw new IllegalArgumentException("Syslog Message: message fieldname must be set"); }

Try / catch

try { processRow(); } catch (KettleException e) { if (e.getMessage().contains("MessageFieldMissing")) { logError("Configure message fieldname"); setErrors(1); stopAll(true); } }

Prevention

When it happens

Trigger: Executing the Syslog Message transform with the 'Message fieldname' left blank in the step dialog.

Common situations: Fresh step dropped onto canvas and run with defaults; XML/rep import lost the fieldname attribute; refactoring renamed the setting and old transformations show blank value.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/954064667e6ed99c. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/syslog/SyslogMessage.java:67

      Trans trans ) {
    super( stepMeta, stepDataInterface, copyNr, transMeta, trans );
  }

  public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {
    meta = (SyslogMessageMeta) smi;
    data = (SyslogMessageData) sdi;

    Object[] r = getRow(); // Get row from input rowset & set row busy!
    if ( r == null ) { // no more input to be expected...

      setOutputDone();
      return false;
    }
    if ( first ) {
      first = false;
      // Check if message field is provided
      if ( Utils.isEmpty( meta.getMessageFieldName() ) ) {
        throw new KettleException( BaseMessages.getString( PKG, "SyslogMessage.Error.MessageFieldMissing" ) );
      }

      // cache the position of the source filename field
      data.indexOfMessageFieldName = getInputRowMeta().indexOfValue( meta.getMessageFieldName() );
      if ( data.indexOfMessageFieldName < 0 ) {
        // The field is unreachable !
        throw new KettleException( BaseMessages.getString( PKG, "SyslogMessage.Exception.CouldnotFindField", meta
            .getMessageFieldName() ) );
      }

    }

    try {
      // get message
      String message = getInputRowMeta().getString( r, data.indexOfMessageFieldName );

      if ( Utils.isEmpty( message ) ) {
        throw new KettleException( BaseMessages.getString( PKG, "SyslogMessage.Error.MessageEmpty" ) );

View on GitHub (pinned to f3058517a1)