文章目录
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);