kettle使用log4j管理输出日志

  在使用kettle进行数据分析和清洗时日志非常多而且杂乱,使用原有的日志有时找不到异常的位置,有时日志不够详细,说简单一点就是日志不是我们想要的。因而对kettle日志进行相应的管理就想得尤为重要了。大家都知道java最常用的日志管理包log4j可以很好地实现java日志的管理,然而kettle是使用java开发的,因而log4j是个不二的选择。好了说了这么多,下面看看kettle怎么使用log4j进行日志的管理吧。

1、kettle加载和使用log4j

在转换的JavaScript中添加log4j的支持

//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;
}

2、准备log4j配置文件log.xml

<?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/run.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>
    <appender name="kettle_error" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="threshold" value="error" />
        <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>

此处需要注意log4j日志的存放路径,路径由变量${WORKDIR}控制,存放路径为项目根目录下的log目录。

3、测试

  运行结果:

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

 注:11年测试的日志文件

时间: 2024-09-27 10:07:13

kettle使用log4j管理输出日志的相关文章

log4j直接输出日志到flume

log4j直接输出日志到flume         此jar是由Cloudera的CDH发行版提供的一个工具类,通过配置,可以将log4j的日志直接输出到flume,方便日志的采集.         在CDH5.3.0版本中是:flume-ng-log4jappender-1.5.0-cdh5.3.0-jar-with-dependencies.jar         所在目录是:/opt/cloudera/parcels/CDH/lib/flume-ng/tools/ 具体使用示例 log4j

flume学习(一):log4j直接输出日志到flume

log4j.properties配置: log4j.rootLogger=INFOlog4j.category.com.besttone=INFO,flumelog4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppenderlog4j.appender.flume.Hostname = localhostlog4j.appender.flume.Port = 44444 log4j.appender.flume.

MyBatis启动时控制台无限输出日志的原因及解决办法_java

你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. Logging initialized using 'class org.apache.ibatis.lo

jsp-使用log4j输出日志记录

问题描述 使用log4j输出日志记录 我编写的代码是直接在jsp中的,业务逻辑处理也是在jsp中处理,我现在想使用日志管理,记录运行的过程及错误,但现在不知道眼怎么写,哪位大神会做呀,求指教 解决方案 第一步:首先建立一个WEB工程,去log4j官网下log4j的JAR包导入到工程的lib目录下 第二步:在src目录下建一个log4j.properties 文件,文件命名可以由自己,只是记加载时候和这里名字一致就行: log4j.properties 里边的内容如下: ### set log l

LOG4J输出日志到web目录的相对路径

 LOG4J输出日志到web目录的相对路径 项目中必须是在使用spring web.xml加入 <span style="font-size:18px;"><context-param> <param-name>webAppRootKey</param-name> <param-value>webApp.root</param-value> </context-param> <context-

log4j设置了每天输出日志,但是现在该日志没有变动的话不会自动输出请问怎么改?

问题描述 log4j设置了每天输出日志,但是现在该日志没有变动的话不会自动输出请问怎么改? log4j.category.Task=INFO,Task log4j.additivity.Task=false log4j.appender.Task=org.apache.log4j.DailyRollingFileAppender log4j.appender.Task.file=/data/logs/Task_4_1.log log4j.appender.Task.DatePattern='.'

log4j输出日志了两遍,求高手帮忙看看

问题描述 log4j输出日志了两遍,求高手帮忙看看 我的项目是用log4j.xml配置的,配置了一个root,然后又配置了一个logger,nane=test,root和logger输出到不同的日志文件中,使用Logger.getLogger("test").info("test").结果两个日志文件都输出了日志,我的期望是只在test那个logger里输出,怎么做才能实现呢?

tomcat7 log4j配置一部分日志还在catalina.out输出

问题描述 tomcat7 log4j配置一部分日志还在catalina.out输出 我按照网上配置在tomcat配置了log4j,一部分日志是按我配置那样输出的,但是有一部分日志还是写入catalina.out,不知道为什么,我看了主要是线程调用的类输出的日志. 有谁知道原因吗? 步骤如下: 1. 把log4j-1.2.17.jar,tomcat-juli.jar,tomcat-juli-adapters.jar拷贝到tomcate目录/ lib下 2. 把tomcat-juli.jar拷贝到t

log4j如何让日志文件输出到相对于classpath的相对路径

问题描述 输出日志到文件,我用的是相对路径,类似这种格式./xxx/test.log.结果我发现这个路径在linux下得到的不是相对class的路径,而是我启动程序的根目录,我没用使用类似tomcat这样的容器,就是直接用java -jar命令启动的程序,结果得到的路径却是我当前所在的路径,到底怎么能让它把日志放在classpath相对路径 解决方案 在程序启动时获取classpath路径,用System.setProperty(log_path,classpath)把值设置到一个变量中,在lo