Kettle日志相关源码分析以及总结

kettle日志基础

一、kettle 的日志等级

public enum LogLevel {
NOTHING(0, “Nothing”),
ERROR(1, “Error”),
MINIMAL(2, “Minimal”),
BASIC(3, “Basic”),
DETAILED(4, “Detailed”),
DEBUG(5, “Debug”),
ROWLEVEL(6, “Rowlevel”);

Nothing 没有日志 不显示任何输出
Error 错误日志 仅仅显示错误信息
Minimal 最小日志 使用最小的日志
Basic 基本日志 缺省的日志级别
Detailed详细日志 给出日志输出的细节
Debug 调试日志 调试目的,调试输出
Rowlevel行级日志 打印出每一行记录的信息

默认为基本日志 Basic

启动命令参数中 加 -level 可以改变日志等级

-level=Debug

二、日志输出到文件中

思路1: 命令行启动sproon.bat > xx.txt中
思路2:
通过以下办法取到日志,然后把这段日志写到文件里
KettleLogStore.getAppender().getBuffer().toString()
获取完日志之后,要清空日志缓冲区。
KettleLogStore.getAppender().clear();

[推荐]思路3: KettleLogStore.getAppender().addLoggingEventListener(); 可以添加一个监听器, 实现 KettleLoggingEventListener 接口 即可逐行获取kettle的控制台日志

[推荐]思路4: 查看KettleLogStroe源码,它会根据环境变量
KETTLE_REDIRECT_STDOUT和KETTLE_REDIRECT_STDERR
值是Y还是N,决定是kettle是否重定向标准输出和标准错误输出。
所以,它肯定还有读取某些配置或环境变量的地方,让配置具体重定向到哪

[推荐]思路5 :直接参考kettle本身已有实现,kettle本身默认就会将日志写入到 一个叫pdi.log文件中,分析kettle该实现即可。

[root@xxx kettle]# find ./ |grep log4j.xml
./data-integration/classes/log4j.xml
./data-integration/system/osgi/log4j.xml

具体分析:todo

四、日志相关源码分析

1. 代码中如何调用使用log编码打印?

如下图,job entry基类有个LogChannelInterface类型的成员变量log,改成员变量就是LogChannel类的实例,如下代码显示,在job entry基类的构造函数中初始化。
在这里插入图片描述
JobEntryBase构造函数如下:

  /**
   * Instantiates a new job entry base object.
   */
  public JobEntryBase() {
    name = null;
    description = null;
    log = new LogChannel( this );
    attributesMap = new HashMap<>();
    extensionDataMap = new HashMap<>();
  }

其中,调 new LogChannel( this );时,其构造函数如下:

  public LogChannel( Object subject ) {
    logLevel = DefaultLogLevel.getLogLevel();
    logChannelId = LoggingRegistry.getInstance().registerLoggingSource( subject );
  }

插件代码中job entry继承了 job entry 基类,自然继承protected LogChannelInterface log成员变量,因此在你的job entry代码中,直接使用 log成员变量实例调用 LogChannel下的各种打印方法即可,如(log.logDebug等);

当然你也可以直接这样调:
直接调logDebug方法,因为public class JobEntryBase 实现了 封装了你对log.logDebug等方法的调用。如下所示:

  public void logDebug( String message ) {
    log.logDebug( message );
  }

就是说你自己插件中可以直接调方法 logDebug,JobEntryBase基类已经帮你封装了一层,本质还是调job基类的的成员变量(LogChannel类实例)log的日志打印方法。

总结: 在job entry插件中,可以使用 类似 logDebug函数直接打印日志,也可以使用 log.Debug这种形式进行打印日志。

五、常见问题

1. kettle日志格式问题:是否支持{}输入变量?

经过测试和查看代码,不支持。 你可以使用 + 或 String.format的方法拼接字符串。

2. 如何修改kettle日志等级?

  • 启动命令,设置日志等级
    查看启动命令,启动脚本添加 -debug参数即可。

  • JobEntry单元测试,设置日志等级
    如果是jobEntry单元测试,设置job的logLevel成员变量即可。

        job = new Job( null, new JobMeta() );
        job.setLogLevel(LogLevel.DEBUG);
       jobEntryXxx.setParentJob(job);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值