Kettle 4.4.0 通过 Java 代码 输出日志到表

之所以选择4.4.0,因为公司还在用Java6编程……


但是项目的需求是:实施人员上传kettle的文件,然后在界面上点击运行,运行完之后需要在页面上看日志。

当然 kettle 是自带日志输出功能的,不过我们总不能跟客户说:“你在kettle里面定义好日志输出,然后自己去数据库或者某个文件夹中查询日志即可”


当然不可能让客户去看数据库或者服务器上生成的日志文件。那现在的问题是怎样让自己的代码控制 kettle 的日志。只要能够通过程序获取,或者按照我们的规则重定向输出,那么事情就好办了,我们就可以按照自己的意愿存储和查询日志(job和trans运行方式不一样,但是在代码层面 编程的方式 是类似的,下面只说Job,看懂了Job,Trans自然就明白了)


Kettle中自带日志输出功能,先说下在kettle中怎么输出日志到数据库表

1、切换到主对象树选项卡


2、双击 自己 写的 Job ,就会弹出一个窗口

切换到日志选项卡

左边选择Job

右边配一下数据库连接(这个窗口的最下方有个SQL按钮,点击一下可以看到建表的SQL)

然后配置连接下面的 一些属性



然后运行 Job 的时候,就会记录日志到数据库中:


会记录很多字段,图中只是一部分。关键字段有3个:

CHANNEL_ID  可以关联到某个Job(下面会讲怎么关联。可以通过此运行记录找到这条数据,然后找到日志信息)

ERRORS           某个Job的错误个数,0表示完美运行完毕(如果不为0,说明有错误)

LOG_FIELD  这个是BLOB或者TEXT字段,存放的是日志详情(这就是我们需要的内容)


这样生成的日志我们能够查询,在Job中有个方法 job.getLogChannelId() ,可以获取CHANNEL_ID,通过这个字段可以关联到日志表。但是这么做需要什么前提呢?


前提是 用 kettle 的人要手动去配置一下我上面所说的步骤:打开日志功能,配置连接

如果条件允许,这么做也行,但是有两个问题:

1、用kettle文件的人知道 日志要放到那个数据库的哪张表吗?

      就算知道,他有权访问数据库吗?

      就算知道并且有权访问,那这位实施人员要待在客户那里实施吗?

      当然啦,可以通过在 kettle 中配置变量的方式解决,就是数据库连接信息和表信息等 用变量占位符。用 kettle 的人在本地用自己本地的数据库,传到服务端后,通过变量替换的方式使用服务端的数据库。这种方式可以解决问题,但是需要用 kettle 的人配合,因为需要配置很多变量。

2、增加开发难度

因为数据这种东西是比较重要的,万一用kettle的人哪里配错了,丢到服务端运行……那就不好了



有没有更好的方式,不让用kettle的人关心日志呢?

既然kettle支持日志输出到表,那这些信息一定会在kettle生成的ktr文件中,然后kettle运行的时候去解析这个 ktr文件,得到各种Java对象(因为kettle是用Java开发的)


那我只要找到 kettle 日志相关的那些 类(class),自己在代码中加入不就好了吗,然后还真就找到了,下面说一下如何实现:

    这是得到Job对象的代码:

    JobMeta jobMeta = new JobMeta(ktrFilePath, null);

    Job job = new Job(null, jobMeta);

    然后现在要做的是,创建一个数据库连接对象和 连接的具体信息,添加到这个 job中(需要在上面两行代码的中间添加代码)。创建数据库连接对象的代码如下:

DatabaseMeta databaseMeta = new DatabaseMeta();
databaseMeta.setName("连接名");

databaseMeta.setDatabaseType("ORACLE");
databaseMeta.setAccessType(DatabaseMeta.TYPE_ACCESS_NATIVE);
databaseMeta.setHostname("数据库IP");
databaseMeta.setDBName("orcl");
databaseMeta.setDBPort("数据库端口");
databaseMeta.setUsername("用户名");
databaseMeta.setPassword("密码");


jobMeta.addDatabase(databaseMeta);

上面有些地方我用中文换掉了,这不是重点,重点是这些代码就创建了数据库连接对象,并添加到了Job元数据中。现在还需要连接信息,也就是schema和表名之类的,通过JobLogTable 这个对象设置,

JobLogTable jobLogTable = JobLogTable.getDefault(jobMeta, jobMeta);
jobLogTable.setConnectionName("连接名");
jobLogTable.setSchemaName("数据库的SCHEMA");
jobLogTable.setTableName("表名");


jobMeta.setJobLogTable(jobLogTable);

要注意的是连接名 必须和 上面创建的数据库连接对象 中的连接名一致,这样就完成了 连接信息的配置,并和job元数据完成了关联,当然还可以配置很多其他信息,这些只是最基本的配置。


配置信息可以放到properties文件中可供配置


然后,可以启动 job了,日志会输出到对应的表中^_^


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kettle 是一个开源的 ETL 工具,可以用于将数据从一个地方抽取到另一个地方,并进行转换和加载。Kettle 也提供了 Java API,可以在 Java 代码中使用 Kettle 来完成 ETL 任务。 下面是一个简单的示例,演示如何使用 KettleJava API 来执行一个简单的 ETL 任务。 首先,需要添加 Kettle 的依赖。可以在 Maven 中添加以下依赖: ```xml <dependency> <groupId>org.pentaho</groupId> <artifactId>kettle-core</artifactId> <version>8.3.0.0-371</version> </dependency> ``` 然后,在 Java 代码中,可以创建一个 Kettle 环境对象,并使用此对象来执行 ETL 任务。以下是一个使用 KettleJava 代码示例: ```java import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LogLevel; import org.pentaho.di.job.Job; import org.pentaho.di.job.JobMeta; public class KettleJavaExample { public static void main(String[] args) throws KettleException { // 初始化 Kettle 环境 KettleEnvironment.init(); // 创建 JobMeta 对象,指定 Job 的定义文件 JobMeta jobMeta = new JobMeta("path/to/job.kjb", null); // 创建 Job 对象 Job job = new Job(null, jobMeta); // 设置日志级别 job.setLogLevel(LogLevel.BASIC); // 执行 Job job.start(); // 等待 Job 执行结束 job.waitUntilFinished(); // 获取 Job 的执行结果 boolean success = job.getResult().getResult(); if (success) { System.out.println("Job executed successfully."); } else { System.out.println("Job execution failed."); } } } ``` 在上面的示例代码中,假设已经有一个定义好的 Job 文件,文件名为 `job.kjb`,并且该文件位于项目根目录下的 `path/to` 目录中。可以使用 `JobMeta` 对象来加载该文件,并创建 `Job` 对象来执行该 Job。在执行 Job 之前,可以设置日志级别,以便更好地跟踪执行过程。最后,等待 Job 执行结束,获取执行结果,并根据结果输出相应的消息。 注意,KettleJava API 可能不是很友好,需要仔细阅读相关文档和示例代码,并进行反复试验和调试,才能熟练掌握。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值