能否根据运行时选择的LogLevel调整Pentaho转换功能?
在PDI转换中运行时访问日志级别(LogLevel)的方法
完全可以在PDI运行时访问日志级别并据此调整流程,PDI默认确实没有将LogLevel暴露到Internal.*或KETTLE_*这类内置变量中,但可以通过以下两种常用方法实现:
方法一:通过Java脚本步骤直接获取转换的日志级别
PDI的转换对象(Trans)内置了日志级别相关的API,你可以在Java脚本步骤中直接调用获取,然后将结果存入字段供后续步骤判断:
import org.pentaho.di.trans.Trans; import org.pentaho.di.core.logging.LogLevel; import org.apache.commons.lang3.ArrayUtils; // 获取当前转换实例 Trans currentTrans = (Trans) getTrans(); // 获取日志级别枚举对象 LogLevel logLevel = currentTrans.getLogLevel(); // 提取日志级别描述字符串(如"DEBUG"、"BASIC") String logLevelStr = logLevel.getDescription(); // 将日志级别作为新字段添加到输出行中 data.outputRowMeta.addValueMeta(new ValueMetaString("CURRENT_LOG_LEVEL")); Object[] newRow = ArrayUtils.add(data.row, logLevelStr); putRow(data.outputRowMeta, newRow);
执行这个步骤后,后续可以用过滤记录步骤设置条件(比如CURRENT_LOG_LEVEL = "DEBUG"),将数据流分流:符合条件的走额外处理分支(如日志写入、记录转储),不符合的走正常执行流程。
方法二:通过作业传递日志级别到转换
如果你的转换是由PDI作业(Job)调用的,可以先在作业中获取日志级别,再通过自定义变量传递给转换:
- 在作业中添加Java脚本步骤,获取作业的日志级别并设置为变量:
import org.pentaho.di.job.Job; import org.pentaho.di.core.logging.LogLevel; Job currentJob = (Job) getJob(); String jobLogLevel = currentJob.getLogLevel().getDescription(); // 设置自定义环境变量 setVariable("JOB_LOG_LEVEL", jobLogLevel);
- 在作业的转换任务配置中,勾选“传递所有变量”选项,这样转换就能通过
${JOB_LOG_LEVEL}访问到日志级别变量,后续同样可以用过滤步骤实现分支逻辑。
这两种方法都能满足你的需求,其中方法一更适合独立运行的转换,方法二更适合作业调度下的转换场景。
内容的提问来源于stack exchange,提问作者Rownum Highart
相关产品推荐
相关产品推荐

