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
- Filter out rows with empty message before the Syslog step
- Replace nulls with a default message using an If Field Value Is Null or Replace in string step
- Catch the error and skip/log the row instead of failing the transformation
- 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
- Filter out empty messages before the syslog step
- Apply NVL/coalesce upstream for optional fields
- Audit source data for null-heavy columns feeding this step
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
- PGPEncryptStream.Error.DataToEncryptEmpty
- WebServiceAvailable.Error.URLEmpty
- ChangeFileEncoding.Error.SourceFileIsEmpty
- ExecProcess.ProcessEmpty
- ExecSQLRow.Log.EmptySQLFromFile
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)