问题简述
java调用kettle脚本,详细日志只能在控制台打印,不能直接输出到log文件。
由于kettle相关资料比较少,没找到合适的,暂时通过简单添加几行代码,实现了kettle运行日志打印输出至log文件。
使用的日志框架是logback,使用log4j 或其他日志框架,使用该方法也可以实现。
java调用kettle脚本,主要使用以下3个jar包
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>7.1.0.1-34</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>7.1.0.1-34</version>
</dependency>
<dependency>
<groupId>pentaho</groupId>
<artifactId>metastore</artifactId>
<version>7.1.0.1-34</version>
</dependency>
一个调用的简单示例
/**
* kettle测试
*
* @author Juveniless
* @create 2020-12-04 22:42
**/
@Slf4j
public class KettleTest1 {
public static void main(String[] args) throws Exception {
String path = "D:\\workspaces\\idea\\git\\EHR_DOCS\\报告.ktr";
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
KettleEnvironment.init();
JobMeta jobMeta = new JobMeta(path, null);
Job job = new Job(null, jobMeta);
job.start();
job.waitUntilFinished();
if (job.getErrors() > 0) {
System.out.println("执行job发生异常:" + job.getResult().toString());
}
}
}
查看 org.pentaho.di.job.Job
类的源码。new Job(null, jobMeta)
构造方法调用如下构造方法
在构造方法中执行this.log = new LogChannel(this, parentLogging);
后续打印log操作,均使用此log实例打印
查看 LogChannel
源码
LogChannel
内所有打印log的方法,均调用``println(LogMessageInterface logMessage, LogLevel channelLogLevel)
方法实现,
入参 LogMessageInterface
代码如下,可以获取到日志信息与日志等级
修改代码
取到了日志内容和等级,添加打印日志的代码即可,主要修改2处代码
- LogChannel 中添加打印日志逻辑
-
修改 println 方法
-
之后将修改后的java文件编译为class文件替换回jar包即可
如何修改和替换
- 在idea中新建
org.pentaho.di.core.logging.LogChannel.java
-
从
kettle-core-7.1.0.1-34.jar
包中,找到LogChannel
的源代码,复制粘贴过来,然后修改即可 -
修改完毕,编译项目,在idea 项目
target/classes
下找到LogChannel.class文件
使用 解压缩软件打开 kettle-core-7.1.0.1-34.jar
,定位到kettle-core-7.1.0.1-34.jar\org\pentaho\di\core\logging
,将LogChannel.class
拖入,替换,保存即可。
- 在 idea项目中 删除新建的 LogChannel.java文件,在 resources 目录下新建jar文件夹,将修改后的 kettle-core-7.1.0.1-34.jar 拖入,然后在maven的pom文件中,注释掉原先的 kettle-core,添加新的坐标,引入修改后的jar即可
<!--<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>7.1.0.1-34</version>
</dependency>-->
<!-- 2021-03-12-该jar包修改过代码,用于将kettle的运行日志使用logback输出至log文件 -->
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>7.1.0.1-34</version>
<scope>system</scope>
<systemPath>
${basedir}/src/main/resources/jar/kettle-core-7.1.0.1-34.jar
</systemPath>
</dependency>
- 最终效果