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

时间:2024-04-12 08:58:26

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


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

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


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


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

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

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

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

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

切换到日志选项卡

左边选择Job

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

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

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


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

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

会记录很多字段,图中只是一部分。关键字段有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了,日志会输出到对应的表中^_^