pentaho/pentaho-kettle · error · KettleXMLException

Unable to load job entry of type 'Syslog' from XML node

Error message

Unable to load job entry of type 'Syslog' from XML node

What it means

KettleXMLException thrown by JobEntrySyslog.loadXML when parsing a 'Syslog' job entry's XML node fails with a KettleXMLException. The entry reads tags serverName, port, message, datePattern, addTimestamp, addHostname; any parse failure is wrapped with this message.

Solutions

  1. Fix malformed XML around the Syslog entry node (validate with an XML tool).
  2. Verify expected tags exist (serverName, port, message, datePattern, addTimestamp, addHostname).
  3. Re-export/re-save the job from Spoon to produce well-formed XML.
  4. Check the wrapped KettleXMLException cause for the exact parse error.

Example fix

// before
Node entry = XMLHandler.getSubNode(jobNode, "entry");
syslogEntry.loadXML(entry, databases, slaveServers, rep, metaStore);
// after
Node entry = XMLHandler.getSubNode(jobNode, "entry");
if (entry == null || XMLHandler.getTagValue(entry, "serverName") == null) {
  throw new KettleXMLException("Syslog entry node missing or incomplete");
}
syslogEntry.loadXML(entry, databases, slaveServers, rep, metaStore);
Defensive patterns

Strategy: validation

Validate before calling

Node entry = XMLHandler.getSubNode(jobNode, "entry");
if (entry == null || XMLHandler.getTagValue(entry, "serverName") == null || XMLHandler.getTagValue(entry, "port") == null) {
  throw new KettleXMLException("Syslog entry node incomplete: serverName and port are required");
}

Type guard

boolean isCompleteSyslogEntry(Node n) {
  return n != null
    && XMLHandler.getTagValue(n, "serverName") != null
    && XMLHandler.getTagValue(n, "port") != null;
}

Try / catch

try {
  syslogEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  logError("Malformed Syslog entry XML: " + e.getCause(), e);
}

Prevention

When it happens

Trigger: Calling loadXML with a malformed or missing Syslog entry node: XMLHandler.getTagValue throwing due to broken markup, or downstream parsing of values (e.g. port) throwing KettleXMLException.

Common situations: Hand-edited .kjb XML with invalid characters in the message/datePattern values; truncated file; cross-version XML incompatibility.

Understand the failure class

Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/syslog/JobEntrySyslog.java:111

    return retval.toString();
  }

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      port = XMLHandler.getTagValue( entrynode, "port" );
      serverName = XMLHandler.getTagValue( entrynode, "servername" );
      facility = XMLHandler.getTagValue( entrynode, "facility" );
      priority = XMLHandler.getTagValue( entrynode, "priority" );
      message = XMLHandler.getTagValue( entrynode, "message" );
      datePattern = XMLHandler.getTagValue( entrynode, "datePattern" );
      addTimestamp = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "addTimestamp" ) );
      addHostname = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "addHostname" ) );

    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'Syslog' from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      port = rep.getJobEntryAttributeString( id_jobentry, "port" );
      serverName = rep.getJobEntryAttributeString( id_jobentry, "servername" );
      facility = rep.getJobEntryAttributeString( id_jobentry, "facility" );
      priority = rep.getJobEntryAttributeString( id_jobentry, "priority" );
      message = rep.getJobEntryAttributeString( id_jobentry, "message" );
      datePattern = rep.getJobEntryAttributeString( id_jobentry, "datePattern" );
      addTimestamp = rep.getJobEntryAttributeBoolean( id_jobentry, "addTimestamp" );
      addHostname = rep.getJobEntryAttributeBoolean( id_jobentry, "addHostname" );

    } catch ( KettleException dbe ) {
      throw new KettleException( "Unable to load job entry of type 'Syslog' from the repository for id_jobentry="
        + id_jobentry, dbe );

View on GitHub (pinned to f3058517a1)