在使用kettle进行数据分析和清洗时日志非常多而且杂乱,使用原有的日志有时找不到异常的位置,有时日志不够详细,说简单一点就是日志不是我们想要的。因而对kettle日志进行相应的管理就想得尤为重要了。大家都知道java最常用的日志管理包log4j可以很好地实现java日志的管理,然而kettle是使用java开发的,因而log4j是个不二的选择。好了说了这么多,下面看看kettle怎么使用log4j进行日志的管理吧。
1、kettle加载和使用log4j
在转换的JavaScript中添加log4j的支持
<pre style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(236, 236, 236); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">//Script here //updateOuputLog(); //confFile 日志配置文件路径 //增加日志输出文件 //通过/../conf/log.xml文件配置日志输出
function updateOutputLog(confFile){ var first = getVariable("FIRST_TIME_UPDATE_LOG", "true"); if(first == "true"){
logWriter = org.pentaho.di.core.logging.LogWriter.getInstance(); var softPath = getThisSoftPath();
setVariable("WORKDIR", softPath, "s");//设置日志路径变量
var logConf = softPath + "/../conf/log.xml"; if(confFile != null && confFile != ""){
logConf = softPath + "/" + confFile;
}else{ if(!fileExists(logConf)){
logConf = softPath + "/log.xml";
} if(!fileExists(logConf)){
logConf = softPath + "/conf/log.xml";
}
}
writeToLog("m", "======logConfPath====>"+logConf);
org.apache.log4j.xml.DOMConfigurator.configure(logConf); var logger = org.apache.log4j.Logger.getLogger("kettle_log"); var appenders = logger.getAllAppenders(); while(appenders.hasMoreElements()){ var appender = appenders.nextElement();
writeToLog("m", "======add==log====>"+appender.getName());
logWriter.addAppender(appender);
}
setVariable("FIRST_TIME_UPDATE_LOG", "false", "r");
}
} //Alert(getThisSoftPath()); //返回程序所在目录 不带前缀file:
function getThisSoftPath(){ var osName = java.lang.System.getProperty("os.name").toLowerCase(); var path = getVariable("Internal.Transformation.Filename.Directory", ""); if(osName.indexOf("windows") >= 0){//WINDOWS系统
path = path.substring(8);
}else{
path = path.substring(7);
} return path;
} function getConfigPath(softDir,confPath,splitStr){ var arr = confPath.split(splitStr); var str = softDir+arr[0]; for(var i=1; i<arr.length; i++){ var s = new java.lang.String(arr[i]); if(arr[i] != null && s.endsWith("properties")){
str = str + splitStr + softDir+ arr[i];
}
} //Alert(str);
return str;
}</pre>
2、准备log4j配置文件log.xml
<pre style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(236, 236, 236); border: 1px solid rgb(204, 204, 204); border-radius: 4px;"><?xml version="1.0" encoding="GBK"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="kettle_info" class="org.apache.log4j.DailyRollingFileAppender">
<param name="threshold" value="info" />
<param name="File" value="{WORKDIR}/../log/error.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p (%F:%L) -> %m%n" />
</layout>
</appender>
<logger name="kettle_log">
<appender-ref ref="kettle_info" />
<appender-ref ref="kettle_error" />
</logger>
</log4j:configuration></pre>
此处需要注意log4j日志的存放路径,路径由变量${WORKDIR}控制,存放路径为项目根目录下的log目录。
3、测试
运行结果:
<pre data-spm-anchor-id="a2c4e.11153940.0.i2.15797f4a4BAHBk" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(236, 236, 236); border: 1px solid rgb(204, 204, 204); border-radius: 4px;">2011-06-08 09:50:28,897 INFO (LogWriter.java:450) -> 设置默认配置文件.0 - ======add==log====>kettle_error
2011-06-08 09:50:28,897 INFO (LogWriter.java:450) -> 设置默认配置文件.0 - 增加配置日志成功
2011-06-08 09:50:28,912 INFO (LogWriter.java:450) -> 设置默认配置文件.0 - E:/test/src/../conf/config_static.properties
2011-06-08 09:50:28,912 INFO (LogWriter.java:450) -> 设置默认配置文件.0 - 完成处理 (I=0, O=0, R=1, W=1, U=1, E=0
2011-06-08 09:50:28,943 INFO (LogWriter.java:450) -> 拆分路径 2.0 - 完成处理 (I=0, O=0, R=1, W=1, U=1, E=0
2011-06-08 09:50:28,943 INFO (LogWriter.java:450) -> 读取配置文件.0 - 配置文件:TO_DB_PWD1=test
2011-06-08 09:50:28,943 INFO (LogWriter.java:450) -> 配置文件输入.0 - 完成处理 (I=20, O=0, R=1, W=20, U=20, E=0
2011-06-08 09:50:28,943 INFO (LogWriter.java:450) -> 读取配置文件.0 - 配置文件:DEST_DB_UNAME2=test</pre>
注:11年测试的日志文件
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
kettle作业,转换日志
0.207
2018.08.10 15:11:16
字数 783
阅读 2206
Kettle以文本行的方式输出日志信息,步骤结束时,可以生成下面的一行日志:
2010/06/18 10:36:29 - step name.0 -
Finished processing (I=0,O=0,R=0,W=25,U=0,E=0)
这个日志行里有以下主要内容:
日期和时间。
步骤名,步骤名的后面有一个点号,点号后面是步骤的拷贝号。
日志内容。
4.每个部分之间都使用空格、横线、空格来分割。
作业,转换的日志基本
行级日志:打印出Kettle里所有可用的日志信息,包括在一些比较复杂的步骤里的每一行数据。
调试日志:也打印出很多日志信息,但没有到每一行数据都打印出来的级别。
详细日志:比基本日志多一些日志内容,如多了SQL查询语句和DDL语句等。
基本日志:默认的日志级别,只打印出执行到哪个步骤和作业项的日志信息。
最小日志:只打印出执行到哪个转换和作业的日志信息。
错误日志:只打印出错误日志,如果没有错误也不打印日志。
无日志:不打印任何日志,即使有错误也不打印。
日志架构
实际上中心缓存里保存了以下内容:
日期和时间:让Spoon在日志窗口用蓝色显示日志的日期和时间。
日志级别:让Spoon在日志窗口用红色显示错误行。
递增的唯一编号:Kettle对不同日志窗口或者远程日志抽取分配的递增的编号。
日志文本内容:实际的日志文本内容。
日志通道ID:这个ID是随机生成的唯一字符串,用来唯一标识生成日志行的Kettle组件。
把日志保存在内存里是导致内存溢出的一个主要的原因。当你执行一个作业或转换而且日志级别设置的比较高时,在执行过程中就会产生大量日志。如果你要求Kettle把这些日志信息存储在日志表里,那么这些日志信息就会暂时保存在内存里,最后就会发生内存溢出问题。
设置缓存大小
限制日志数量通常想到的第一个方法就是设置缓存大小。可以在Spoon的“选项”对话框里设置这个参数。在对话框里的“日志窗口的最大行数”输入框里设置。要注意该选项只在Spoon里有效
另一个选择就是设置KETTLE_MAX_LOG_SIZE_IN_LINES环境变量。可以在kettle.properties文件里设置这个环境变量。
最后,也可以在Carte的配置文件中设置这个参数。例如在服务器的配置XML文件中加入下面的配置行,将中心日志缓存的大小设置为10000行: