kettle使用log4j管理输出日志

作者: 叫我老村长 | 来源:发表于2019-11-01 09:42 被阅读0次

    在使用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/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></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行:

    相关文章

      网友评论

        本文标题:kettle使用log4j管理输出日志

        本文链接:https://www.haomeiwen.com/subject/iyeovctx.html