{"record":{"id":"53c8b32e5e56586d","repo":"pentaho/pentaho-kettle","slug":"log-string-is-too-long","errorCode":null,"errorMessage":"Log string is too long","messagePattern":"Log string is too long","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/www/GetTransStatusServlet.java","lineNumber":533,"sourceCode":"\n  public String toString() {\n    return \"Trans 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( Trans trans, int startLineNr, int lastLineNr ) throws KettleException {\n    try {\n      return KettleLogStore.getAppender().getBuffer(\n        trans.getLogChannel().getLogChannelId(), false, startLineNr, lastLineNr ).toString();\n    } catch ( OutOfMemoryError error ) {\n      throw new KettleException( \"Log string is too long\", error );\n    }\n  }\n\n}\n","sourceCodeStart":515,"sourceCodeEnd":538,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/www/GetTransStatusServlet.java#L515-L538","documentation":"getLogText in GetTransStatusServlet stringifies the transformation's log buffer; an OutOfMemoryError during that conversion is rethrown as a KettleException 'Log string is too long'. It means the log text is too big to fit in memory as a String.","triggerScenarios":"GET /kettle/transStatus/ (any mode calling logText) where KettleLogStore buffer for the trans channel exceeds available heap when converted with toString().","commonSituations":"High-volume transformations with row-count-per-line logging; long-running trans polled repeatedly; undersized -Xmx on Carte; KettleLogStore max-lines setting too high or unlimited.","solutions":["Increase JVM heap.","Bound the log range requested (startLineNr/lastLineNr) or use tail-based log retrieval.","Set KettleLogStore.getAppender().setMaxNumberOfLines(...) / KETTLE_LOG_BUFFER_SIZE env to cap buffer size.","Lower the transformation's log level."],"exampleFix":"// before\nappender.setMaxNumberOfLines(0); // unlimited\n// after\nappender.setMaxNumberOfLines(10000); // cap buffer, stringification stays within heap","handlingStrategy":"validation","validationCode":"int last = KettleLogStore.getLastBufferLineNr();\nboolean safeToFetch = (last - startLineNr) < 100_000; // bounded line window","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Cap KettleLogStore.getAppender().setMaxNumberOfLines(...) on the server.","Fetch tail windows only; never stringify the entire buffer.","Increase -Xmx relative to worst-case log volume.","Use Rowlevel logging sparingly on production transformations."],"tags":["outofmemory","logging","transformation","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"}