pentaho/pentaho-kettle · error · KettleException

Unable to write log channel in transformation information…

Error message

Unable to write log channel in transformation information to log table!

What it means

Thrown by writeLogChannelInformation when any Exception occurs while persisting channel log records (and cleaning up timed-out records) for the channel log table. The message is borrowed from the Trans message key but thrown in the Job class; the original exception is chained.

Solutions

  1. Inspect the chained cause for the root SQL/IO failure
  2. Create/repair the channel log table with the generated DDL
  3. Verify the logging database connection configuration
  4. Re-run after confirming DB availability; consider periodic cleanup to keep the table small
Defensive patterns

Strategy: try-catch

Validate before calling

try (Connection c = db.connect()) {
  ResultSet rs = c.getMetaData().getTables(null, null, channelLogTable.getTableName(), null);
  if (!rs.next()) throw new IllegalStateException("Channel log table missing: " + channelLogTable.getTableName());
}

Try / catch

try {
  job.run();
} catch (KettleException e) {
  if (e.getMessage().contains("Unable to write log channel")) {
    log.error("Channel log persistence failed", e.getCause());
  }
}

Prevention

When it happens

Trigger: Any failure during channel log writes or db.cleanupLogRecords(channelLogTable, ...) — bad connection, missing table, SQL error, or unexpected exception in the write path.

Common situations: Channel log table not created; wrong logging DB configured; Kettle version mismatch between client and log table DDL; transient DB outages during job run.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/Job.java:1264

    // end PDI-7070

    try {
      db = new Database( this, channelLogTable.getDatabaseMeta() );
      db.shareVariablesWith( this );
      db.connect();
      db.setCommit( logCommitSize );

      List<LoggingHierarchy> loggingHierarchyList = getLoggingHierarchy();
      for ( LoggingHierarchy loggingHierarchy : loggingHierarchyList ) {
        db.writeLogRecord( channelLogTable, LogStatus.START, loggingHierarchy, null );
      }

      // Also time-out the log records in here...
      //
      db.cleanupLogRecords( channelLogTable, getJobname() );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG,
          "Trans.Exception.UnableToWriteLogChannelInformationToLogTable" ), e );
    } finally {
      if ( !db.isAutoCommit() ) {
        db.commit( true );
      }
      db.close();
    }
  }

  /**
   * Write job entry log information.
   *
   * @throws KettleException
   *           the kettle exception
   */
  protected void writeJobEntryLogInformation() throws KettleException {
    Database db = null;
    JobEntryLogTable jobEntryLogTable = getJobMeta().getJobEntryLogTable();

View on GitHub (pinned to f3058517a1)