pentaho/pentaho-kettle · error · KettleException

SyslogMessage.Error.MessageEmpty

Error message

SyslogMessage.Error.MessageEmpty

What it means

Localized error thrown by the SyslogMessage step's processRow when the message obtained from the configured message field at the current input row is empty (or the row structure otherwise fails the message validity check). The step cannot send an empty syslog message, so it aborts with KettleException carrying the i18n key SyslogMessage.Error.MessageEmpty. Fix by ensuring each incoming row has a non-empty value in the message field before the step runs.

Solutions

  1. Filter out rows with empty message before the Syslog step
  2. Replace nulls with a default message using an If Field Value Is Null or Replace in string step
  3. Catch the error and skip/log the row instead of failing the transformation
  4. Coalesce the message field upstream: NVL(field, 'default')

Example fix

// before
// rows with empty message reach syslog step and fail
// after
// add a Filter rows step: message IS NOT NULL AND message <> "" before the syslog step
Defensive patterns

Strategy: validation

Validate before calling

String msg = rowMeta.getString(row, idx);
if (msg == null || msg.isEmpty()) { logBasic("Skipping row with empty message"); return true; }

Try / catch

try { ... } catch (KettleException e) { if (e.getMessage().contains("MessageEmpty")) { logBasic("Skipping empty message row"); return true; } throw e; }

Prevention

When it happens

Trigger: Incoming row's message field contains null or "" for the current row; upstream step produced an empty value for that record.

Common situations: Optional source data with missing values; filter conditions upstream passing rows with blank message fields; JSON/XML source where the element is absent for some records.

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/b5dcf2d0e70db966. Report an issue: GitHub.

Appendix: source

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

        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" ) );
      }

      // Send message
      SyslogDefs.sendMessage( data.syslog, SyslogDefs.getPriority( meta.getPriority() ), message,
          meta.isAddTimestamp(), data.datePattern, meta.isAddHostName() );

      putRow( getInputRowMeta(), r ); // copy row to output rowset(s);

      if ( checkFeedback( getLinesRead() ) ) {
        if ( isDetailed() ) {
          logDetailed( BaseMessages.getString( PKG, "SyslogMessage.LineNumber", getLinesRead() ) );
        }
      }
    } catch ( Exception e ) {

      boolean sendToErrorRow = false;
      String errorMessage = null;

View on GitHub (pinned to f3058517a1)