记录kettle日志

需求:

最近公司做一个任务调度项目,其中一个小任务需要调度kettle,现有一需求,就是kettle产生的日志,不管正确与否,都要写入日志文件中

问题分析:

目前java调入job 代码如下(简化)

//设定kettle文件地址
JobMeta jobMeta = new JobMeta(kjbPath, null);
 
Job job = new Job(null, jobMeta);
// 配置作业参数
for (String key : parmap.keySet()) {
    job.setVariable(key, parmap.get(key));
}
// 启动作业
job.start();
// 等待作业执行完毕
job.waitUntilFinished();

kettle日志是输出到console 控制台的,网上有日志入数据库表的办法,但不能解决本次需求;日志输出到文件解决思路有两个,第一个思路:截获控制台System.out标准输出流,重定向到文件; 第二个思路:寻找kettle API,监听kettle日志然后进行处理。


解决步骤

第一步:截获System.out 输出到文件 代码如下(简化)

//设定kettle文件地址
JobMeta jobMeta = new JobMeta(kjbPath, null);
 
Job job = new Job(null, jobMeta);
// 配置作业参数
for (String key : parmap.keySet()) {
    job.setVariable(key, parmap.get(key));
}
 
 
//将标准输出重定向到文件
PrintStream out = System.out;
String logFileName = 'd:\\logfile.log' //此处根据业务动态获取日志文件
System.setOut(new PrintStream(logFileName));
 
// 启动作业
job.start();
// 等待作业执行完毕
job.waitUntilFinished();
 
 //恢复标准输出
System.setOut(out);

第一步完成后发现实际效果与预期不符,日志文件里记录了部分日志,不是全部日志,查看kettle源码后发现,kettle 执行任务时,里边的转换是多线程调用的,所以,在main中改变标准输出后,其他线程还是照样输出到控制台,只有main线程乖乖输出到文件。所以,采取第二步行动。

第二步:监听kettle日志,代码如下

//设定kettle文件地址
JobMeta jobMeta = new JobMeta(kjbPath, null);
 
Job job = new Job(null, jobMeta);
// 配置作业参数
for (String key : parmap.keySet()) {
    job.setVariable(key, parmap.get(key));
}
 
 
//监听kettle日志
KettleLogStore.getAppender().addLoggingEventListener(new KettleLoggingEventListener() {
       @Override
       public void eventAdded(KettleLoggingEvent logs) {
          //logs为kettle运行时输出的日志。
          System.out.println(logs.getMessage());
        }
});
 
// 启动作业
job.start();
// 等待作业执行完毕
job.waitUntilFinished();

 

至此,圆满完成老板需求。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
kettle是一款流行的ETL工具,也可以使用Java代码来完成数据过滤和记录筛选的任务。通过使用Java代码在kettle中进行过滤记录的操作,我们可以实现以下步骤: 1. 首先,在kettle中选择一个适合的步骤,例如使用"过滤记录"步骤或者"Java脚本"步骤。这些步骤可以在kettle的工具箱中找到。 2. 对于"过滤记录"步骤,我们可以使用Java代码编写复杂的过滤逻辑,以通过筛选条件将特定的记录保留或者删除。Java代码可以利用kettle提供的API方法,如getRow、getField等来获取数据,并使用if-else语句或循环结构来实现过滤逻辑。例如,可以使用getField方法获取指定字段的值,并根据条件判断是否保留该记录。 3. 对于"Java脚本"步骤,我们可以直接编写复杂的Java代码来实现过滤逻辑。可以使用kettle提供的变量或者字段名来读取和操作数据,例如使用输入流和输出流来筛选记录。在Java代码中,可以使用if-else语句、循环结构、正则表达式等来实现过滤逻辑。 4. 不论选择哪种方法,都需要保证Java代码的正确性和有效性。可以通过在kettle中运行调试模式,逐步执行Java代码来检查代码的运行情况。如果需要,还可以添加日志输出来查看执行过程中的变量值和过滤结果。 总之,kettle提供了多种方式来通过Java代码过滤记录,可以根据具体的需求和数据特点选择合适的方法。通过使用Java代码,我们可以灵活地实现各种过滤逻辑,并对数据进行筛选和记录处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值