kettle pentaho log4j 日志记录
版本:kettle 4.1
需求描述:
使用java集成kettle
插件,执行脚本时,控制台可以显示kettle
和调用类的日志,但是日志文件却只能显示调用类的日志,kettle
日志不显示。
需求分析:
分析发现 kettle-engine.jar
包中有一个log4j.xml,其中仅包含CONSOLE
这一个appender
;
提取log4j.xml
文件,然后在其中新增一个DailyRollingFileAppender
,然后在java中引用该appender,问题解决。
完整代码:
1、log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- ===================================================================== -->
<!-- -->
<!-- Log4j Configuration -->
<!-- -->
<!-- ===================================================================== -->
<!-- $Id: log4j.xml,v 1.1.2.4 2005/10/06 23:05:58 bill Exp $ -->
<!-- | For more configuration infromation and examples see the Jakarta Log4j
| owebsite: http://jakarta.apache.org/log4j -->
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<param name="Threshold" value="INFO" />
<param name="encoding" value="utf-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss} - %m%n" />
</layout>
</appender>
<!-- 文件日志 -->
<appender name="etl-core" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/etl-core.log" />
<param name="Threshold" value="INFO" />
<param name="encoding" value="utf-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss} - %m%n" />
</layout>
</appender>
<category name="org.pentaho">
<priority value="DEBUG"/>
</category>
<category name="com.healthmarketscience.jackcess">
<priority value="WARN" />
</category>
<category name="org.apache.commons.httpclient">
<priority value="WARN" />
</category>
<category name="org.mortbay">
<priority value="ERR" />
</category>
<category name="java.net">
<priority value="NONE" />
</category>
<category
name="org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient">
<priority value="WARN" />
</category>
<category
name="org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient.auth">
<priority value="WARN" />
</category>
<root>
<priority value="info" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="etl-core" />
</root>
</log4j:configuration>
2、java代码
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.pentaho.di.core.DBCache;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.logging.LogLevel;
import org.pentaho.di.core.logging.LogWriter;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
/**
* @description Kettle Api 调用示例
* @author hury
*/
public class EtlExample {
static Logger logger = Logger.getLogger(EtlExample.class);
public static void init() {
try {
KettleEnvironment.init();
DBCache.getInstance();
LogWriter.getInstance().addAppender(Logger.getRootLogger().getAppender("etl-core"));
} catch (KettleException e) {
logger.error("初始化kettle环境异常。");
e.printStackTrace();
}
}
public static void runJob(String jobname) {
try {
// jobname 是Job脚本的路径及名称
JobMeta jobMeta = new JobMeta(jobname, null);
Job job = new Job(null, jobMeta);
job.setLogLevel(LogLevel.DEBUG);
// 向Job 脚本传递参数,脚本中获取参数值:${参数名}
// job.setVariable(paraname, paravalue);
job.start();
job.waitUntilFinished();
if (job.getErrors() > 0) {
logger.error("runJob fail!");
}
} catch (KettleException e) {
logger.error(e);
}
}
// 调用Transformation示例:
public static void runTrans(String filename) {
try {
// 外部参数
Map<String, String> ps = new HashMap<String, String>();
ps.put("jgid", "参数1");
ps.put("jgmc", "参数2");
// 调用ktr脚本
TransMeta transMeta = new TransMeta(filename);
for (String key : ps.keySet()) {
String value = ps.get(key);
transMeta.setParameterValue(key, value);
}
Trans trans = new Trans(transMeta);
trans.prepareExecution(null);
trans.startThreads();
trans.waitUntilFinished();
if (trans.getErrors() != 0) {
logger.error("Error");
}
} catch (KettleXMLException e) {
e.printStackTrace();
} catch (KettleException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
init();
// String jobname = "config/test/test.kjb";
// runJob(jobname);
logger.info("start etl");
String filename = "config/test/test_ktr.ktr";
runTrans(filename);
logger.info("over");
}
}