{"record":{"id":"49f29628456b72cd","repo":"pentaho/pentaho-kettle","slug":"getjobstatusservlet-error-logstringistoolong","errorCode":"GetJobStatusServlet.Error.LogStringIsTooLong","errorMessage":"GetJobStatusServlet.Error.LogStringIsTooLong","messagePattern":"GetJobStatusServlet\\.Error\\.LogStringIsTooLong","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/www/GetJobStatusServlet.java","lineNumber":499,"sourceCode":"\n  public String toString() {\n    return \"Job Status Handler\";\n  }\n\n  public String getService() {\n    return CONTEXT_PATH + \" (\" + toString() + \")\";\n  }\n\n  public String getContextPath() {\n    return CONTEXT_PATH;\n  }\n\n  private String getLogText( Job job, int startLineNr, int lastLineNr, int numberOfTailLines ) throws KettleException {\n    try {\n      return KettleLogStore.getAppender().getBuffer(\n        job.getLogChannel().getLogChannelId(), false, startLineNr, lastLineNr, numberOfTailLines ).toString();\n    } catch ( OutOfMemoryError error ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"GetJobStatusServlet.Error.LogStringIsTooLong\" ) );\n    }\n  }\n}\n","sourceCodeStart":481,"sourceCodeEnd":503,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/www/GetJobStatusServlet.java#L481-L503","documentation":"getLogText in GetJobStatusServlet converts the job's log channel buffer to a String; if that allocation causes an OutOfMemoryError, it is replaced by this KettleException. It signals the accumulated log text is too large to build in memory.","triggerScenarios":"GET /kettle/jobStatus/ (XML or HTML mode) on a job whose logging buffer grew so large that KettleLogStore.getAppender().getBuffer(...).toString() exhausts heap.","commonSituations":"Long-running jobs with verbose logging polled over Carte; small heap (-Xmx) on slave servers; startLineNr/lastLineNr spanning thousands of log lines; numberOfTailLines not used so the full buffer is stringified.","solutions":["Increase JVM heap for the Carte server.","Request fewer log lines (use tail-line parameters or a narrower startLineNr/lastLineNr range).","Limit KettleLogStore buffer size (KETTLE_LOG_BUFFER_SIZE / setMaxNumberOfLines) so buffers stay bounded.","Reduce log verbosity (log level) for the job channel."],"exampleFix":"// before\nString log = servlet.getLogText(job, 0, kettleLogStore.getLastBufferLineNr()); // full buffer -> OOM\n// after\nString log = servlet.getLogText(job, 0, kettleLogStore.getLastBufferLineNr(), 500); // tail 500 lines","handlingStrategy":"validation","validationCode":"long approxBytes = KettleLogStore.getAppender().getBuffer(job.getLogChannelId(), false).length();\nboolean safe = approxBytes < 50_000_000; // well under heap headroom","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set KettleLogStore max number of lines (KETTLE_LOG_BUFFER_SIZE) to bound buffers.","Use tail-line parameters instead of fetching the full log.","Size Carte heap (e.g. -Xmx4g) relative to expected log volume.","Lower job log level (Basic instead of Rowlevel) for long-running jobs."],"tags":["outofmemory","logging","job-status","servlet"],"backgroundTag":"payload-too-large","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}