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
- Fix malformed XML around the Syslog entry node (validate with an XML tool).
- Verify expected tags exist (serverName, port, message, datePattern, addTimestamp, addHostname).
- Re-export/re-save the job from Spoon to produce well-formed XML.
- 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
- Validate .kjb XML before loading jobs generated externally
- Avoid special characters in message/datePattern values without proper escaping
- Re-export jobs from the same PDI version that will load them
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
- JobEntrySuccess.Meta.UnableToLoadFromXML
- Unable to load job entry of type 'sql' from XML node
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- JobEntryZipFile.UnableLoadJobEntryXML
- JobMoveFiles.Error.Exception.UnableLoadXML
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)